java - 如何从 .NET 通过 Azure Servicebus 发送 javax.jms.TextMessage

标签 java azure amqp servicebus

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

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

并将其作为 TextMessage (javax.jms.TextMessage) 显示在 Java 客户端中。但是,当我尝试将 Java 中的消息转换为 TextMessage 时,出现异常,指出它无法将 jms.impl.BytesMessageImpl 转换为 TextMessage。有人知道为什么该消息看起来像 BytesMessage 而不是 TextMessage 吗?

根据docs 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

[更新2] 我找出了问题的根本原因。在我的设置中,我有一个订阅者将消息转发到队列。看来这就是消息变得困惑的地方。如果我直接向队列发送 AMQP 消息,它将作为 TextMessage 到达我的 Java 应用程序。如果我通过 AMQP 将消息发送到我的主题,然后它通过订阅者(带有过滤器)转发到我的队列,它就会被破坏成 BytesMessage。

那么我该如何让它正常工作呢?有没有办法设置我的订阅者转发到队列,这样就可以了?

最佳答案

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


最诚挚的问候,
戴夫。
服务总线团队

关于java - 如何从 .NET 通过 Azure Servicebus 发送 javax.jms.TextMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18552859/

相关文章:

java - 为什么删除会使实现函数类型复杂化?

azure - Azure B2C是否提供 "true"多个应用程序之间的单点登录

amqp - 是否可以使用AMQP声明最大队列大小?

rabbitmq - 如何在 RabbitMQ 中重新排队消息

java - 使用枚举来决定打印哪些文本的迷宫游戏

java - 如何启动获取文件锁并相互等待的并发线程

java - 如何在 Linux 中运行 Netflix Astyanax

java - 使用 Azure Active Directory 时如何从 WebSecurityConfigurerAdapter 迁移到 SecurityFilterChain

caching - CacheServiceEmulator.exe > 3GB RAM 使用量?

objective-c - 如何为 iOS 5 编译 Rabbitmq-c 库?