2013-12-17 42 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); 
    } 
} 

消息錯誤隊列,則錯誤隊列中可見。

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

只是指出我沒有使用多播或訂閱服務。將消息添加到隊列中的代碼是執行發送而不是發佈。