RabbitMQ 不会在无效的路由键上抛出错误
RabbitMQ not throwing error on invalid routing key
我在 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 和无效路由密钥发布消息时,它会给出一条消息 "Message published, but not routed."
提前致谢。
为此,有一个叫做 PublisherAcknoledgement 的东西。这基本上会向发布者提供有关消息状态的 Ack。您还可以区分消息是到达 Exchange 还是到达消费者。您只需要妥善处理每个案例。
这是了解邮件传递状态的好方法。您可能不知道它是否由于错误的路由密钥而发生,但通过进行各种检查,您可能能够缩小结果范围。
它不存在 "invalid routing key" 的概念,因为您可以将队列动态绑定到交换器。
顺便说一下,您要查找的是 "unroutable messages",如果消息未到达任何队列,您必须使用 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());
我在 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 和无效路由密钥发布消息时,它会给出一条消息 "Message published, but not routed."
提前致谢。
为此,有一个叫做 PublisherAcknoledgement 的东西。这基本上会向发布者提供有关消息状态的 Ack。您还可以区分消息是到达 Exchange 还是到达消费者。您只需要妥善处理每个案例。
这是了解邮件传递状态的好方法。您可能不知道它是否由于错误的路由密钥而发生,但通过进行各种检查,您可能能够缩小结果范围。
它不存在 "invalid routing key" 的概念,因为您可以将队列动态绑定到交换器。
顺便说一下,您要查找的是 "unroutable messages",如果消息未到达任何队列,您必须使用 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());