Hi
I have a custom dead letter queue service to pick up messages from DLQ. This service picks up failed message from DLQ and tries to resend to a different end point. If the new endpoint doesn't work, it rolls back transaction. This works great. Here is the code.
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Single,
AddressFilterMode = AddressFilterMode.Any)]
public class FDPDLQService : IFDService
{
FDPManager _fdpManager = new FDPManager();
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ProcessFDMessage(FDMessage message)
{
//System.Diagnostics.Debugger.Launch();
try
{
MsmqMessageProperty mqProp =
OperationContext.Current.IncomingMessageProperties[MsmqMessageProperty.Name] as MsmqMessageProperty;
// if message log required, and configured, log the incoming message
try
{
ChannelFactory
IFDPRouter proxy = factory.CreateChannel();
string ep = proxy.GetNextEPForGivenEP(OperationContext.Current.IncomingMessageHeaders.To.ToString());
if (ep == null || ep == string.Empty)
{
throw new EndpointNotFoundException(Common.Constants.FDP_NOT_FOUND_EXCEPTION_MESSAGE);
}
// Process message with next end point available
_fdpManager.ProcessFDMessage(message, ep);
}
catch (EndpointNotFoundException enfe)
{
ExceptionManager.HandleException(enfe);
Transaction.Current.Rollback();
//throw;
}
catch (Exception ex)
{
ExceptionManager.HandleException(ex);
Transaction.Current.Rollback();
//throw;
}
}
}
}
Below is config entries.
durable="true" exactlyOnce="true" maxReceivedMessageSize="65536"
maxRetryCycles="2" receiveErrorHandling="Fault" receiveRetryCount="5"
retryCycleDelay="00:30:00" timeToLive="00:01:00" useSourceJournal="false"
useMsmqTracing="false" queueTransferProtocol="Native" maxBufferPoolSize="524288"
useActiveDirectory="false">
durable="true" exactlyOnce="true" maxReceivedMessageSize="65536"
maxRetryCycles="2" receiveErrorHandling="Fault" receiveRetryCount="5"
retryCycleDelay="00:30:00" timeToLive="00:01:00" useSourceJournal="false"
useMsmqTracing="false" queueTransferProtocol="Native" maxBufferPoolSize="524288"
useActiveDirectory="false">
durable="true" exactlyOnce="true" maxReceivedMessageSize="65536"
maxRetryCycles="2" receiveErrorHandling="Fault" receiveRetryCount="5"
retryCycleDelay="00:30:00" timeToLive="1.00:00:00" useSourceJournal="false"
useMsmqTracing="false" queueTransferProtocol="Native" maxBufferPoolSize="524288"
useActiveDirectory="false">
bindingConfiguration="DefaultBinding">
contract="FDPServiceRef.IFDService" name="FDService_EP" />
This works great.
But if all endpoints are not available for a long period of time, and if service rolls message back to the DLQ for a long period of time, after a certain period of time service stops picking up messages from DLQ. I am not sure which configuration is responsible for this. Can you guide me?
Regards
Jaimin Gandhi.
Suthish NairPosted Dec 16, 2010, 5:44 AM
Next time please only post you query in editor and upload the code as attachment.
There might be some timeout happening at your proxy end.
Am not sure but give a try if any time out has been updated some where in settings.