NServiceBus停止致命错误

时间:2012-03-13 22:07:24

标签: c# msmq 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());

1 个答案:

答案 0 :(得分:2)

您可能希望实现IManageMes​​sageFailures接口。通过此界面,您可以访问异常和消息:

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

如果失败,它将调用您在配置中指定的任何内容作为要采取的操作。这是通过DefineCriticalErrorAction(Action onCriticalError)完成的。默认设置是将工作线程数设置为0,允许您减少该过程。您可能希望在故障管理器中执行此操作。您应该可以使用传输层来添加线程。