2017-02-24 79 views
0

我在C#中有以下代碼,如果路由鍵無效,它不會拋出錯誤。RabbitMQ不會在無效路由鍵上拋出錯誤

var connFactory = GetConnectionFactory(); 

using (var conn = connFactory.CreateConnection()) 
{ 
    using (var channel = conn.CreateModel()) 
    { 
     channel.TxSelect(); 

     var publicationAddress = new PublicationAddress(ExchangeType.Direct, Settings.ServiceBusExchange, Settings.ServiceBusRoutingKey); 

     var headers = new Dictionary<String, Object>(); 
     headers.Add("TransactionID", transactionID); 

     var basicProperties = new BasicProperties(); 
     basicProperties.ContentEncoding = Encoding.UTF8.ToString(); 
     basicProperties.ContentType = "text/xml"; 
     basicProperties.Headers = headers; 
     basicProperties.DeliveryMode = 2; 

     var payLoad = Encoding.UTF8.GetBytes(message); 

     channel.BasicPublish(publicationAddress, basicProperties, payLoad); 
     channel.TxCommit(); 
    } 
} 

我的問題是,如果路由鍵無效,我怎麼能使代碼拋出錯誤?就像我用RabbitMQ UI發佈帶有無效路由密鑰的消息一樣,它會發出一條消息:「已發佈消息,但未路由」。

在此先感謝。

回答

1

它不存在「無效路由密鑰」的概念,因爲您可以將動態隊列綁定到交換機。

你正在尋找順便說一下什麼是「不可路由的消息」,你必須在同一個通道使用mandatory標誌和落實ReturnListener,如果消息沒有達成任何隊列將被重定向到處理程序。 在此以這種方式(該代碼是Java,但在c#或多或少是相同的):

boolean isMandatory = true; // if true the message will be handled by HandlingReturnListener 
     // if false the message will be dropped! 

     channel.addReturnListener(new ReturnListener() { 
      public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException { 
       System.out.println(replyText + ":" + replyCode); 
       System.out.println("******** UnHandled Message ***************"); 

      } 

     }); 

     String myExchange = "myUnroutableExchange_"; 
     channel.exchangeDeclare(myExchange, "topic", false, false, null); 
     channel.basicPublish(myExchange, "NO_KEY", isMandatory, null, "".getBytes()); 
-1

爲此,有一種叫做PublisherAcknoledgement的東西。這基本上會給出版商一個Ack的消息狀態。您還可以區分郵件是否已到達Exchange或已到達消費者的位置。你只需要正確處理每個案例。

這是瞭解正在傳遞的消息狀態的好方法。您可能不知道它是否因爲錯誤的路由密鑰而發生,但可以通過進行各種檢查來縮小結果範圍。

+1

'發佈Confirm'確認消息到達服務器不是隊列。 – Gabriele