0

为了提高应用程序的响应能力,消息处理程序使用多个响应进行响应。但它观察到消息只有在消息处理完全完成后才会传递到目的地,即使事务被禁用如下 var busConfiguration = new BusConfiguration(); busConfiguration.Transactions().Disable();

我们的代码如下:使用MyMessages;使用 NServiceBus;使用系统;

    public class RequestDataMessageHandler : IHandleMessages<RequestDataMessage>
    {
        public IBus Bus { get; set; }

        public void Handle(RequestDataMessage message)
        {

            Console.WriteLine("Received request {0}.", message.DataId);
            Console.WriteLine("String received: {0}.", message.String);

            var response1 = new DataResponseMessage
            {
                DataId = message.DataId,
                String = "InProgress"
            };

            Bus.Reply(response1);


            try
            {
                TimeConsumingActivity();
                var response = new DataResponseMessage
                {
                    DataId = message.DataId,
                    String = message.String
                };

                Bus.Reply(response);
            }
            catch
            {
                var response2 = new DataResponseMessage
                {
                    DataId = message.DataId,
                    String = "Error in the process"            
                };
                Bus.Reply(response2);
            }
        }
    }

但是它的观察者只有在 TimeConsumingActivity 完成后才知道 response1 和 response 到达目的地(这不是订单的问题)

4

2 回答 2

1

尝试:

 busConfiguration.Transactions().DoNotWrapHandlersExecutionInATransactionScope();

所以,这是我的理解。NSB 配置中有几个与事务相关的设置,我不确定我能否明确描述它们之间的差异。

上面的设置应该防止您的处理程序被包装在 TransactionScope 中,这(如果未禁用)可能会导致在事务完成之前回复消息没有“释放”到总线。

于 2015-01-15T15:01:43.423 回答
0

我已经在 NServiceBus 谷歌组上回答了

于 2015-01-16T16:02:28.423 回答