2012-03-13 61 views
1

我们使用NServiceBus将有关一个系统中数据更改的消息传播到我们环境中的其他系统。NServiceBus在致命错误上停止

当我们在我们的一个客户端(接收)系统中遇到异常时,我们想停止处理消息而不从队列中移除失败的消息,以便我们可以调查问题并从同一地点队列。

完成此操作的最佳方法是什么?

编辑: 继承人我的当前设置

 Configure.With() 
      .DefiningCommandsAs(t => typeof(ICommand).IsAssignableFrom(t)) 
      .DefiningEventsAs(t => typeof(IEvent).IsAssignableFrom(t)) 
      .DefiningMessagesAs(t => typeof(IMessage).IsAssignableFrom(t)) 
      .Log4Net<NlogAppenderForLog4Net>(a => { }) 
      .NinjectBuilder(Kernel) 
      .XmlSerializer() 
      .MsmqTransport() 
       .DefineEndpointName("consumer.input") 
       .IsTransactional(true) 
       .PurgeOnStartup(false) 
      .MsmqSubscriptionStorage("consumer") 
      .UnicastBus() 
       .LoadMessageHandlers() 
       .ImpersonateSender(false) 
      .CreateBus().Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install()); 
+0

你是如何托管它? – 2012-03-13 22:11:56

+0

@JoachimIsaksson在windows服务中,我的NServiceBus config中添加了ive – 2012-03-14 00:03:01

+0

您可以通过更改saga的状态然后将所有后续消息推送到超时服务来完成此操作。大可能?这是'排队中的同一个地方',让我很担心。您确定在正常处理过程中,所有消息都以一致的顺序接收和处理吗? – 2012-03-14 00:33:48

回答

2

你可能要实现的IManageMes​​sageFailures接口。这个界面允许您访问异常和消息:

public interface IManageMessageFailures 
{ 
    void SerializationFailedForMessage(TransportMessage message, Exception e); 
    void ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e); 
} 

如果失败,它会叫你在你的配置中指定要采取任何行动。这是通过DefineCriticalErrorAction(Action onCriticalError)完成的。默认情况下,将工作线程的数量设置为0,从而允许您停止进程。你可能想在你的故障管理器中做到这一点。您应该能够利用传输层来添加线程。