【问题标题】:Message not being sent to the error queue消息未发送到错误队列
【发布时间】:2014-01-10 17:15:48
【问题描述】:

我正在使用带有 MSMQ 的 MassTransit 2.9.2 版。

我正在测试错误处理,并希望该过程尝试发送我的消息 5 次,然后将消息放入错误队列中。

消息被重试了 5 次,然后就消失了。谁能解释为什么消息没有被发送到错误队列。

我的消费者:

public class OrderConsumer : Consumes<SAPOrder>.Context
{
    public ISapServiceRepository SapServiceRepository { get; set; }

    public void Consume(IConsumeContext<SAPOrder> message)
    {
        try
        {
            // Send the message to SAP
            this.SapServiceRepository.SendOrder(message.Message);

        }
        catch (Exception ex)
        {

            throw;
        }       
    }
}

我正在使用 AutoFac 注册服务总线和消费者。

    protected override void Load(ContainerBuilder builder)
    {
        builder.Register(c => ServiceBusFactory.New(sbc =>
        {
            // other configuration options
            sbc.UseMsmq(
                configurator => configurator.VerifyMsmqConfiguration());

            sbc.UseXmlSerializer();
            sbc.ReceiveFrom("msmq://localhost/orders");
            sbc.Subscribe(x => x.LoadFrom(c.Resolve<ILifetimeScope>()));
            sbc.EnableMessageTracing();
            sbc.UseLog4Net();
        })).As<IServiceBus>()
            .SingleInstance();

        if (this.registerConsumers)
        {
            builder.RegisterAssemblyTypes(this.GetType().Assembly)
                .Where(t => t.Implements<IConsumer>())
                .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies)
                .AsSelf();

            builder.RegisterType<SapServiceRepository>()
                .As<ISapServiceRepository>()
                .InstancePerLifetimeScope()
                .WithProperty("Username", "xxxxxxxxxxxx")
                .WithProperty("Password", "xxxxxxxxxxxx")
                .WithProperty("CountryId", "xxxxxxxxxxx")
                .WithProperty("UseRequestLogging", true)
                .PropertiesAutowired(
                    PropertyWiringOptions.PreserveSetValues | PropertyWiringOptions.AllowCircularDependencies);
        }
    }

谢谢

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    是否存在阻止创建 _error 队列的权限问题?队列是否显示在消息队列 MMC 窗格中?正如您所期望的那样,消息应该在五次失败后最终出现在错误队列中。有一些单元测试也可以验证这一点,并且正在通过。是否从错误队列中读取的内容可能正在使用该消息?

    【讨论】:

      【解决方案2】:

      错误队列已创建。

      我认为没有从错误队列中读取任何内容,因为我已经发布了原始消息,因此我为故障创建了一个新的消费者。一旦尝试了 5 次重试,就会调用它。

      在故障消费者中,我得到原始的失败消息,然后可以使用代码转发到错误队列

      public class OrderFaultConsumer : Consumes<Fault<SAPOrder>>.Context
      {
          public ILog Logger { get; set; }
      
          public void Consume(IConsumeContext<Fault<SAPOrder>> message)
          {
              // need to send to the error queue
              var errorQueue = message.Bus.GetEndpoint(message.Endpoint.ErrorTransport.Address.Uri);
              errorQueue.Send(message.Message.FailedMessage);
          }
      }
      

      然后该消息在错误队列中可见。

      这一切似乎都行得通,但在我看来有点小题大做!

      只是指出我没有使用多播或订阅服务。我将消息添加到队列的代码是发送而不是发布。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 2016-09-21
        • 1970-01-01
        • 2016-05-02
        • 2012-02-12
        • 2021-05-22
        • 2012-08-29
        相关资源
        最近更新 更多