2017-02-24 84 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