0

我正在尝试使用 amqp 通过 azure 服务总线将简单的字符串消息从 .NET 发送到 Java 客户端。根据文档,我应该能够发送这样的代理消息:

message = new BrokeredMessage("this is a text string");

并将其作为 TextMessage (javax.jms.TextMessage) 显示在 Java 客户端中。但是,当我尝试将 Java 中的消息转换为 TextMessage 时,我收到一个异常,说它无法将 jms.impl.BytesMessageImpl 转换为 TextMessage。任何人都知道为什么消息看起来像 BytesMessage 而不是 TextMessage?

根据文档,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。

那么我怎样才能让它正常工作呢?有没有办法设置我的订阅者转发到队列所以这有效?

4

2 回答 2

1

您编写的代码看起来是正确的。我唯一能想到的是你有一个旧版本的 .NET SDK,它是在添加 AMQP 支持之前发布的。您能否使用来自http://www.nuget.org/packages/WindowsAzure.ServiceBus/的最新服务总线 SDK 尝试您的代码。

问候,
戴夫。
(服务巴士团队。)

于 2013-09-02T17:54:52.970 回答
1

当前,在使用转发规则时,服务总线 AMQP 互操作性故事存在限制。在转发期间,使用数据合同序列化程序错误地重新序列化消息。我们将解决这个问题,完成后我会在这里报告。同时,一种可能的解决方法是使用消息属性来存储应用程序数据而不是正文。也就是说,使用消息上的字符串属性来存储显着信息,而不是使用正文。


最好的问候,
戴夫。
服务巴士团队

于 2013-11-18T05:34:01.757 回答