我试图通过azure服务总线上的amqp将一个简单的字符串消息从.NET发送到Java客户端。根据{{3}}我应该能够发送这样的代理消息:
message = new BrokeredMessage("this is a text string");
并将其作为TextMessage(javax.jms.TextMessage)显示在Java客户端中。但是,当我尝试将消息作为TextMessage转换为Java时,我得到一个异常,说它无法将jms.impl.BytesMessageImpl转换为TextMessage。任何人都知道为什么消息看起来像BytesMessage而不是TextMessage?
根据documentation,BytesMessage将按如下方式构建:
byte[] bytes = { 33, 12, 45, 33, 12, 45, 33, 12, 45, 33, 12, 45 };
message = new BrokeredMessage(bytes);
我没有做....
任何人都知道如何做这样的事情?
[更新] 有趣的是,我在连接字符串中使用和不使用TransportType = Amqp指定测试了我的发送代码。我还在运行时验证了代码,每次MessagingFactory设置也设置为正确的传输类型。无论我使用哪种传输类型,消息都以BytesMessage的形式到达我的Java应用程序。无论消息如何发送,查看消息中的字节都会显示相同的结果:
@ string 3http://schemas.microsoft.com/2003/10/Serialization/�&BLABLA this is a message
[UPDATE2] 我找出了问题的根本原因。在我的设置中,我有一个将消息转发到队列的订阅者。看来这就是消息搞砸的地方。如果我将AMQP消息直接发送到队列,它将作为TextMessage进入我的Java应用程序。如果我通过AMQP将消息发送到我的主题,然后通过订阅者(带有过滤器)转发到我的队列,它将被损坏为BytesMessage。
那么如何让它正常工作?有没有办法设置转发到队列的订户,这样可行吗?
答案 0 :(得分:1)
您编写的代码看起来是正确的。我唯一能想到的是你有一个旧版本的.NET SDK,一个是在添加AMQP支持之前发布的。您可以使用http://www.nuget.org/packages/WindowsAzure.ServiceBus/中的最新Service Bus SDK尝试使用代码。
此致
戴夫。
(服务巴士团队。)
答案 1 :(得分:1)
使用转发规则时,服务总线AMQP互操作性故事目前存在限制。在转发过程中,使用数据协定序列化程序错误地重新序列化消息。我们将解决这个问题,并且在完成后我会在这里报告。与此同时,可能的解决方法是使用消息属性来存储应用程序数据而不是正文。也就是说,在消息上使用字符串属性来存储显着信息而不是使用正文。
祝各位发言,
戴夫。
服务巴士团队