rabbitmq中,我是使用C#语言,
然后我MQ中的生产者代码是通配符模式,传过去的参数有头部信息,因此可以正常发送数据。
但是消费者代码也是通配符模式,也是需要传递头部信息,但是一直回调不到数据。返回的一直是空数据。
有人帮我瞧瞧嘛。
using (var connection = connFactory.CreateConnection())
using (var channel = connection.CreateModel())
{
// 声明交换机和队列
//var exchangeName = "GRAVITY_DC_ICS_DESIGN_PO_ORDER_FAST_CREATE_OUTPUT";
var queueName = channel.QueueDeclare().QueueName;
// 绑定交换机和队列以及头部条件
channel.ExchangeDeclare(exchangeName, ExchangeType.Topic, true);
// var arguments = new Dictionary<string, object>
//{
// { "destination", "PoOrderResponseEvent" } // 头部条件,可以根据需要自定义
//};
var properties = channel.CreateBasicProperties();
// 设置自定义头部信息
properties.Headers = new Dictionary<string, object>
{
{ "destination", "PoOrderResponseEvent" },
};
var routeKey = "topic.*";
channel.QueueBind(queueName, exchangeName, routeKey, properties.Headers);
//channel.QueueBind(queueName, exchangeName, "*", arguments: arguments); // 绑定队列到交换机并设置通配符模式
// 创建基本消费者
var consumer = new EventingBasicConsumer(channel);
var sds=new BasicDeliverEventArgs();
// 注册接收消息的事件处理程序
consumer.Received += (sender, args) =>
{
sds = args;
var message = Encoding.UTF8.GetString(args.Body.ToArray());
Console.WriteLine("Received message: {0}", message);
};
var sdsd = sds;
// 启动消费者开始接收消息
channel.BasicConsume(queueName, true, consumer);
Console.WriteLine("Waiting for messages. Press Enter to exit.");
Console.ReadLine();
从您提供的代码来看,您的消费者代码似乎没有问题。但是,在使用通配符模式时,您需要确保生产者和消费者使用相同的路由键和交换机名称。您可以尝试在生产者代码中指定与消费者代码相同的路由键和交换机名称。如果问题仍然存在,请检查您的RabbitMQ服务器是否正常运行,并且消息是否正确发送到了交换机。您可以使用RabbitMQ管理界面来检查这些信息。
从代码来看,在消费者代码中使用了 BasicDeliverEventArgs 类型的变量 sds,但是并没有对其进行赋值。当你在 Received 事件处理程序中尝试访问 sds 变量时,它仍然是空的。
消费者如何保证消息幂等性,不被重复消费
解决办法:
①使用全局MessageID判断消费方使用同一个,解决幂等性。
②或者使用业务逻辑保证唯一(比如订单号码)