2013-12-17 41 views
0

我正在使用MassTransit版本2.9.2与MSMQ。消息未被发送到错误队列

我正在测试错误处理,并期望过程尝试发送我的消息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); 
     } 
    } 

感谢

回答

0

是否有权限问题防止正在创建的_error队列?消息队列MMC窗格中显示队列吗?正如你所期望的那样,这个消息应该在错误队列中出现五次故障后结束。有单元测试验证这一点以及正在通过。从错误队列读取消息可能是消息吗?

0

错误队列已创建。

我不认为有任何东西从错误队列中读取,因为我发布了原始消息,我为Fault创建了一个新消费者。一旦尝试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); 
    } 
} 

消息错误队列,则错误队列中可见。

这一切似乎工作,但在我心中是一个黑客!

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