public static IFailedMessageHandler CreateFailureHandler(FailureHandlerType type, string queueName, string deadQueueName, string retryQueueName) { IFailedMessageHandler failureHandler = null; if (type == FailureHandlerType.Discard) { failureHandler = new DiscardMessageHandler(); } if (type == FailureHandlerType.AlwaysRollback) { failureHandler = new AlwaysRollBackHandler(); } else if (type == FailureHandlerType.SendToBack) { failureHandler = new SendToBackHandler( CreateAndGetQueue(deadQueueName)); } else if (type == FailureHandlerType.RetrySendToDead) { failureHandler = new RetrySendToDeadLetterQueueHandler( CreateAndGetQueue(deadQueueName)); } else if (type == FailureHandlerType.SeparateRetry) { failureHandler = new SeparateRetryQueueHandler( CreateAndGetQueue(retryQueueName)); } return(failureHandler); }
public void receiveMessage(IFailedMessageHandler failedMessageHandler) { if (incomingQueue == null) { throw new NullReferenceException("La coda di ricezione non è stata specificata"); } gotMessage = null; SetFormatter(); MessageQueueTransaction transaction = new MessageQueueTransaction(); transaction.Begin(); // Message message = null; try { gotMessage = incomingQueue.Receive(TimeSpan.Zero, transaction); Log("Received message ID: " + gotMessage.Id); ProcessMessage(); transaction.Commit(); Log("Message processed OK"); } catch (Exception e) { Log("Message failed"); TransactionAction transactionAction = TransactionAction.ROLLBACK; if (gotMessage == null) { Log("Message couldn't be received: " + e.Message); Log("Message couldn't be received (stak: " + e.StackTrace); } else { try { transactionAction = failedMessageHandler.HandleFailedMessage(gotMessage, transaction); } catch (Exception failureHandlerException) { Log("Error during failure handling: " + failureHandlerException.Message); } } if (transactionAction == TransactionAction.ROLLBACK) { transaction.Abort(); Log("Transaction rolled back"); } else { transaction.Commit(); Log("Transaction commited - message removed from queue"); } } }
/// <summary> /// Receive message wrapped with a transaction to handle failures based on handler passed into ctor /// </summary> /// <param name="failedMessageHandler">Determines what implementation should be taken in the event of poisoned messages.</param> private bool ReceiveMessage(msmq.MessageQueue incomingQueue, IFailedMessageHandler failedMessageHandler) { incomingQueue.MessageReadPropertyFilter.SetAll(); using (var transaction = new MessageQueueTransaction()) { transaction.Begin(); Message message = null; try { message = incomingQueue.Receive(TimeSpan.Zero, transaction); Logger.LogDebug("Received message ID: " + message.Id); ProcessMessage(message); transaction.Commit(); Logger.LogDebug("Message processed OK"); return true; } catch (MessageQueueException msgQueueError) { if (msgQueueError.Message == "Time out for the requested operation has expired.") { // No message found to process before TimeSpan expired // {gulp} Swallow exception return false; } } catch (Exception e) { Logger.LogDebug("Message failed"); TransactionAction transactionAction = TransactionAction.ROLLBACK; if (message == null) { Logger.LogDebug("Message couldn't be received: " + e.Message); } else { try { transactionAction = failedMessageHandler.HandleFailedMessage(message, transaction); } catch (Exception failureHandlerException) { Logger.LogDebug("Error during failure handling: " + failureHandlerException.Message); } } if (transactionAction == TransactionAction.ROLLBACK) { transaction.Abort(); Logger.LogDebug("Transaction rolled back"); } else { transaction.Commit(); Logger.LogDebug("Transaction committed - message removed from queue"); } } return false; } }
private int ProcessMessages(msmq.MessageQueue queue, string retryQueueAddress, int messageMaxToProcessAtOneTime, IFailedMessageHandler failedMsgHandler) { int messageCount = 0; while (queue.CanRead && messageCount < messageMaxToProcessAtOneTime) { bool msgReceivedSuccess = ReceiveMessage(queue, failedMsgHandler); if (msgReceivedSuccess) { messageCount++; } else { return messageCount; } } return messageCount; }