我有一个使用单个Azure服务总线消息队列的Java应用程序和NodeJS应用程序。互操作性Azure服务总线消息队列消息
我跟我的客户见证了一些奇怪的效果,如下。
JAVA消息生产者(使用每天青JMS教程QPID库):
TextMessage message = sendSession.createTextMessage();
message.setText("Test AMQP message from JMS");
long randomMessageID = randomGenerator.nextLong() >>>1;
message.setJMSMessageID("ID:" + randomMessageID);
sender.send(message);
System.out.println("Sent message with JMSMessageID = " + message.getJMSMessageID());
OUTPUT:2414932965987073843
的NodeJS消息消费者:
serviceBus.receiveQueueMessage(queue, {timeoutIntervalInS: timeOut, isReceiveAndDelete: true}, function(err, message) {
if(message !==null)console.log(util.inspect(message, {showHidden: false, depth: null}));
});
与JMSMessageID按= ID发送消息OUTPUT:
{ body: '@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/�\u001aTest AMQP message from JMS',
brokerProperties:
{ DeliveryCount: 1,
EnqueuedSequenceNumber: 5000004,
EnqueuedTimeUtc: 'Wed, 04 Nov 2015 21:28:21 GMT',
MessageId: '2414932965987073843',
PartitionKey: '89',
SequenceNumber: 59672695067659070,
State: 'Active',
TimeToLive: 1209600,
To: 'moequeue' },
contentType: 'application/xml; charset=utf-8' }
如果我比较,为)通过serviceBus.sendQueueMessage(插入到队列中的消息,则性质是这样的:
{ body: 'test message',
brokerProperties:
{ DeliveryCount: 1,
EnqueuedSequenceNumber: 0,
EnqueuedTimeUtc: 'Wed, 04 Nov 2015 21:44:03 GMT',
MessageId: 'bc0a3d4f-15ba-434f-9fb0-1a3789885f8c',
PartitionKey: '734',
SequenceNumber: 37436171906517256,
State: 'Active',
TimeToLive: 1209600 },
contentType: 'text/plain',
customProperties:
{ message_number: 0,
sent_date: Wed Nov 04 2015 21:44:03 GMT+0000 (UTC) } }
所以内容类型是不同的下手 - 为什么? - 然后第一个消息有效载荷的主体中的奇怪垃圾来自哪里:@ \ u0006string \ b3http://schemas.microsoft.com/2003/10/Serialization/ \ u001a 这是序列化?这怎么能被缓解?
查找代码,以及在这里:
了解,那么有没有一种方法可以在Node中“安全”反序列化这些消息?我坚持所有客户端的相同协议是一个好主意,但现实可能会有所不同,有效负载仍然需要可交换。 – MoB
@ user3506080在发送者和接收者中使用不同的协议并不是一个好主意。但我认为,如果真的有必要,您可以通过特殊字符分割内容来安全地获取正确的信息。 –
虽然这些信息在技术上是正确的,但它显然是错误的。 AMQP是一种二进制传输协议,根本不会对实际的消息进行任何编码。消息的编码是JMS。如果将消息的类型更改为字节消息(JmsByteMessage),则编码将被REST服务解释为“application/octetstream”,而不是“application/xml”,并且您的消息将在节点中可读。 –