2017-02-24 6 views
0

ルーティングキーが無効な場合、エラーをスローしません。無効なルーティングキーで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

「無効なルーティングキー」の概念は存在しません。これは、動的キューをExchangeにバインドできるためです。

Btwあなたが探しているのは、メッセージが何らかのキューに到達しない場合は、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

関連する問題