Rabbitmq 兔子为AMQP 1.0消息保存额外字节

Rabbitmq 兔子为AMQP 1.0消息保存额外字节,rabbitmq,amqp,Rabbitmq,Amqp,我有一个环境,其中一些AMQP1.0和一些AMQP0.9.1客户端需要写入RabbitMQ队列或从中读取。我启用了AMQP1.0Rabbit插件,它正在工作,但我在每个AMQP1.0消息的正文中都会得到额外的字节 我使用rhea(typescript)通过AMQP1.0发送消息: const连接:连接=新连接( { 主机:“localhost”, 港口:5672, id:“我的id”, 重新连接:正确 } ); const senderName=“sender01”; 常数senderOptio

我有一个环境,其中一些AMQP1.0和一些AMQP0.9.1客户端需要写入RabbitMQ队列或从中读取。我启用了AMQP1.0Rabbit插件,它正在工作,但我在每个AMQP1.0消息的正文中都会得到额外的字节

我使用
rhea
(typescript)通过AMQP1.0发送消息:

const连接:连接=新连接(
{
主机:“localhost”,
港口:5672,
id:“我的id”,
重新连接:正确
}
);
const senderName=“sender01”;
常数senderOptions:senderOptions={
姓名:senderName,
目标:{
地址:“target.queue”
},
onError:(context:EventContext)=>{},
onSessionError:(上下文:EventContext)=>{}
};
等待连接。打开();
const sender:sender=wait connection.createSender(senderOptions);
发送者,发送({
正文:JSON.stringify({“一”:“二”,“三”:“四”}),
内容编码:“UTF-8”,
内容类型:“应用程序/json”
});
控制台日志(“已发送”);
等待发件人。关闭();
等待连接。关闭();
控制台日志(“连接关闭”);
此示例有效,但这是存储在队列中的内容:

base64编码信息是AFN3oRx7Im9uZSI6InR3byIsInRocmVlIjoiZm91ciJ9,解码后变成:

Sw{"one":"two","three":"four"}
还有一个额外的
Sw
,我没有发送

我尝试使用官方RabbitMQ库(它讲的是AMQP 0.9.1)设置java客户端,以查看这些额外字节是否发送到客户端:

ConnectionFactory=newconnectionfactory();
setHost(“localhost”);
Connection Connection=factory.newConnection();
Channel=connection.createChannel();
channel.basicConsume(
“target.queue”,
是的,
(消费者标签,送货)->{
字符串消息=新字符串(delivery.getBody(),“UTF-8”);
System.out.println(“[x]收到“+”消息“+””);
},
忽略->{}
);
这是输出:

 [x] Received ' Sw�{"one":"two","three":"four"}'
奇怪的是,如果我尝试使用与AMQP 1.0客户端完全相同的消息,这些额外的字节不会出现在收到的消息正文中,只有在使用AMQP 1.0发布和使用AMQP 0.9.1订阅时,才会出现额外的字节

为什么呢?在使用两个AMQP版本时,有没有办法避免额外的字节


更新

我还尝试使用SwiftMQ:

int nMsgs=100;
int qos=qos.AT\u最多\u次;
AMQPContext ctx=新的AMQPContext(AMQPContext.CLIENT);
String host=“localhost”;
int端口=5672;
String queue=“target.queue”;
试一试{
连接=新连接(ctx、主机、端口、false);
setContainerId(UUID.randomUUID().toString());
connection.setIdleTimeout(-1);
connection.setMaxFrameSize(1024*4);
setExceptionListener(异常::printStackTrace);
connection.connect();
{
Session Session=connection.createSession(10,10);
Producer p=session.createProducer(队列,qos);
对于(int i=0;i
问题仍然存在,但第一个字节已更改,现在我得到:

[x] Received '□�□□□□□□□w�{"one":"two","three":"four"}'
请参阅以下说明如何对有效负载进行编码并避免这些额外字节:

如果AMQP 1.0客户端向0-9-1客户端发送消息,并在“数据段”(即不在AMQP序列段,不在AMQP值段)中将其有效负载编码为二进制,则0-9-1客户端应获得完整的有效负载,无需任何额外字节


注意:RabbitMQ团队监控
RabbitMQ用户
,有时只回答有关StackOverflow的问题。

请查看哪一部分澄清了如何编码有效负载和避免这些额外字节:

如果AMQP 1.0客户端向0-9-1客户端发送消息,并在“数据段”(即不在AMQP序列段,不在AMQP值段)中将其有效负载编码为二进制,则0-9-1客户端应获得完整的有效负载,无需任何额外字节



注意:RabbitMQ团队监控
RabbitMQ用户
,有时只回答有关StackOverflow的问题。

在两侧使用0.9.1,在其他地方使用相同的逻辑是否有效?为什么不在双方都坚持这一点呢?这两个规范之间有很大的差异。@两边都使用0.9.1的层可以工作,但我在生态系统中有一些组件(如Azure Event Hub)只能使用AMQP 1.0进行通信,因此我需要支持这两个协议。可能是因为这两个协议之间的规范不同。我建议您在应用程序中进行转换,作为0-9-1客户端的解决方案。我同意这是一个奇怪而好的问题。@theMayer我认为这也是协议之间的差异问题,但我认为AMQP1.0插件将为我处理这些问题。让我们看看是否有人有线索,也许我只是做错了什么。谢谢你的时间!我确实仔细研究了一下,但没有发现任何明确的迹象,只是表明编码上有一些差异。请记住,它也可能是您正在使用的特定客户机,因为客户机还需要尊重协议的差异。在双方使用0.9.1,在其他地方使用相同的逻辑是否有效?为什么不在双方都坚持这一点呢?这两个规范之间有很大的差异。@两边都使用0.9.1的层可以工作,但我在生态系统中有一些组件(如Azure Event Hub)只能使用AMQP 1.0进行通信,因此我需要支持这两个协议。可能是因为这两个协议之间的规范不同。我建议您在应用程序中进行转换,作为0-9-1客户端的解决方案。我同意这是一个奇怪而好的问题。@theMayer我认为这也是协议之间的差异问题,但我认为AMQP1.0插件会