C# RabbitMQ未在无效路由密钥上引发错误
我在C#中有以下代码,如果路由密钥无效,它不会抛出错误C# RabbitMQ未在无效路由密钥上引发错误,c#,rabbitmq,rabbitmq-exchange,C#,Rabbitmq,Rabbitmq Exchange,我在C#中有以下代码,如果路由密钥无效,它不会抛出错误 var connFactory = GetConnectionFactory(); using (var conn = connFactory.CreateConnection()) { using (var channel = conn.CreateModel()) { channel.TxSelect(); var publicationAddress = new Publicatio
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();
}
}
var connFactory=GetConnectionFactory();
使用(var conn=connFactory.CreateConnection())
{
使用(var channel=conn.CreateModel())
{
channel.TxSelect();
var publicationAddress=新的publicationAddress(ExchangeType.Direct、Settings.ServiceBusExchange、Settings.ServiceBusRoutingKey);
var headers=newdictionary();
headers.Add(“TransactionID”,TransactionID);
var basicProperties=新的basicProperties();
basicProperties.ContentEncoding=Encoding.UTF8.ToString();
basicProperties.ContentType=“text/xml”;
basicProperties.Headers=头;
basicProperties.DeliveryMode=2;
var payLoad=Encoding.UTF8.GetBytes(消息);
channel.BasicPublish(发布地址、基本属性、有效负载);
channel.TxCommit();
}
}
我的问题是,如果路由密钥无效,如何使代码抛出错误?与使用带有无效路由密钥的RabbitMQ UI发布消息类似,它会给出一条消息“消息已发布,但未路由”
提前感谢。为此,有一种叫做PublisherAcknoledgement的东西。这基本上会向发布者提供有关消息状态的确认。您还可以区分消息是到达了till Exchange还是到达了till消费者。你只需要妥善处理每一件事
这是了解正在传递的消息的状态的好方法。您可能不知道这是否是由于错误的路由密钥造成的,但通过执行各种检查,您可能能够缩小到结果。为此,有一种称为PublisherAcknoledgement的方法。这基本上会向发布者提供有关消息状态的确认。您还可以区分消息是到达了till Exchange还是到达了till消费者。你只需要妥善处理每一件事
这是了解正在传递的消息的状态的好方法。您可能不知道这是否是由于错误的路由密钥造成的,但通过执行各种检查,您可能能够缩小到结果。不存在“无效路由密钥”的概念,因为您可以将队列动态绑定到交换机 顺便说一句,您要查找的是“不可终止的消息”,您必须使用
强制
标志,并在同一通道中实现ReturnListener
,如果消息未到达任何队列,将重定向到处理程序。
以这种方式(代码是Java,但在c#中大致相同):
它不存在“无效路由密钥”的概念,因为您可以将队列动态绑定到交换机 顺便说一句,您要查找的是“不可终止的消息”,您必须使用
强制
标志,并在同一通道中实现ReturnListener
,如果消息未到达任何队列,将重定向到处理程序。
以这种方式(代码是Java,但在c#中大致相同):
Publish Confirm
确认消息到达服务器而不是队列。Publish Confirm
确认消息到达服务器而不是队列。
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());