【问题标题】:When sending XML to JMS should I use TextMessage or BytesMessage将 XML 发送到 JMS 时,我应该使用 TextMessage 还是 BytesMessage
【发布时间】:2012-06-06 16:02:11
【问题描述】:

我在网上发现了一些非常矛盾的信息,我认为每个不同的 JMS 提供者也可能会改变答案。

我试图了解在将 XML 发送到 JMS 系统(例如 ActiveMQ)时是否应该使用

  • BytesMessage :我可以保证 XML 已正确序列化,并且前导码将与实际编码匹配。此外,我可以确定客户端将能够正确获取原始表示。

  • TextMessage :在许多队列实现中都有用于轻松发送 XML 的 API。我也了解消息附加了“编码”信息。但我冒着以一种格式编码消息(并将其编写为序言)并将其作为另一种格式接收的风险。

有没有人有明确的答案,或者至少有一些理由让您选择其中一个而不是另一个?

【问题讨论】:

  • 没有明确的答案,对不起,伙计。我的 2cts:XML 是一种文本格式,因此使用 TextMessage。如果您要发送二进制数据,例如 zip 或 jpg,则使用 BytesMessage。让事情本身有意义(没有文档)。它让(开发人员/测试人员/维护人员)的生活更轻松。
  • 尝试为国防项目工作并告诉您的经理“我们不会记录它以使其更容易......”。我仍然明白你在说什么。 Base 64 编码的 UTF8 还不错,无需求助于 MTOM 之类的东西。

标签: java xml serialization character-encoding jms


【解决方案1】:

我同意jos' 对您的问题的评论。首先,您应该选择最能表达您内容的语义的消息类型。阅读TextMessage Javadoc,我会这样做:

此消息类型可用于传输基于文本的消息,包括带有 XML 内容的消息。

因此,如果您确实在文本消息编码方面遇到问题,那么客户端/服务器端可能存在一些错误配置。但这不应该成为滥用主要不是用于文本传输的不同消息类型的动机,例如BytesMessage

注意:即使使用BytesMessage,您也可能会弄错编码。想象一下:

// Send that data through JMS
byte[] data1 = "source text".getBytes("ISO-8859-1");

// Receive the byte stream on the other side. Ooops
String data2 = new String(data1, "UTF-8");

【讨论】:

  • 是的,但是我在 .Net 中使用的库会在给定数据流的情况下查找字节顺序标记并正确识别编码。加上我的 xml 有序言。但我听到的是陪审团已经出局了。
  • 有趣的是(我目前正在处理类似的类型问题)-在 Java 8 中,代码 sn-p 有效:data1= "[B@3d4eac69" 和 data2="source text",即原文。
猜你喜欢
  • 2021-09-27
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多