RabbitMQ不会在无效的路由密钥上抛出错误

时间:2017-02-24 22:01:58

标签: c# rabbitmq rabbitmq-exchange

我在C#中有以下代码,如果路由密钥无效,则不会抛出错误。

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发布消息时,它会发出消息“消息已发布,但未路由。”

提前致谢。

2 个答案:

答案 0 :(得分:1)

它不存在&#34;无效路由密钥&#34;的概念,因为您可以动态地将队列绑定到交换机。

顺便说一句您要查找的内容是&#34;无法发送的消息&#34;,如果邮件无法覆盖,您必须使用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 :(得分:-1)

为此,有一个名为PublisherAcknoledgement的东西。这基本上会向发布者提供有关消息状态的Ack。您还可以区分消息是否已到达Exchange或已到达消费者。你只需要妥善处理每个案件。

这是了解正在传递的邮件状态的好方法。您可能不知道它是否因为错误的路由密钥而发生,但是通过进行各种检查,您可能可以缩小到结果范围。