Python(Pika)发RabbitMQ消息到.NET(MassTransit)消费时进入错误队列问题
问题根本原因
消息进入queue_net_error队列是MassTransit的默认异常处理逻辑:无法正常消费的消息会自动转发到对应错误队列。你当前场景的核心问题是MassTransit默认的消息约定和Pika发送的原始消息格式不匹配,具体有两处不兼容:
- MassTransit默认使用JSON序列化器解析消息体,Python端发送的
body='message'是纯文本,不是合法JSON字符串(JSON格式的字符串要求用双引号包裹,正确值应为"message"),导致反序列化失败。 - MassTransit默认要求消息携带
message_id属性,当前Pika发布的消息未配置该属性,会被判定为无效消息。
反向操作(.NET发布、Python消费)正常的原因是:MassTransit发布的消息自带完整约定属性和合法序列化后的消息体,Pika作为原生客户端不会做额外格式校验,可直接读取原始内容。
解决方案(二选一即可)
方案1:修改Python发布端代码,适配MassTransit默认约定
调整发布的消息体和属性配置,符合MassTransit默认要求:
import json import uuid import pika connection = pika.BlockingConnection(pika.URLParameters('amqp://guest:guest@rabbitmq:5672/%2F')) channel = connection.channel() channel.queue_declare(queue='queue_net', durable=True) # 字符串内容转为合法JSON字符串 body = json.dumps("message") channel.basic_publish( exchange='', routing_key='queue_net', body=body, properties=pika.BasicProperties( content_type = 'application/json', delivery_mode = 2, message_id = str(uuid.uuid4()) # 补充必填的消息ID属性 ) ) connection.close()
方案2:修改.NET端MassTransit配置,兼容原始文本消息
无需改动Python代码,在接收端点配置原始消息支持,跳过MassTransit默认格式校验:
cfg.ReceiveEndpoint("queue_net", ep => { ep.ConfigureConsumeTopology = false; // 新增text/plain类型的原始消息反序列化器 ep.AddRawMessageDeserializer(contentType: "text/plain"); ep.ConfigureConsumer<SampleConsumer>(ctx); });
如果使用MassTransit 8+版本,且需要兼容无message_id的消息,可额外添加消息选择逻辑:
cfg.ReceiveEndpoint("queue_net", ep => { ep.ConfigureConsumeTopology = false; ep.AddRawMessageDeserializer("text/plain"); // 手动过滤有效消息,跳过message_id校验 ep.SelectiveConsumer<string>(ctx => Task.FromResult(ctx.Message != null)); ep.ConfigureConsumer<SampleConsumer>(ctx); });
内容的提问来源于stack exchange,提问作者Pippo
相关产品推荐
相关产品推荐

