是否可以将 JMS TextMessage 转换为 BytesMessage?

问题描述

我目前正在使用 IBM MQ 并接收消息。该消息作为 javax.jms.TextMessage 发送,我无法控制它。发送的消息非常大,我需要我的应用程序在一定数量的内存中运行。因此,我不想将整个消息正文加载到内存中。是否有将消息转换/接受为 javax.jms.BytesMessage方法?我的目标基本上是使用输出流并将数据发送到文件中,这样我就不必将其保存在内存中并节省空间。

@JmsListener(...)
public void receiveMessage(TextMessage m){
   String s = m.getText() // taking lot of memory
}

解决方法

技术上可以转换消息,但如果您在内存有限的环境中进行转换,几乎肯定不会对您有帮助。

客户端上的任何转换过程都将涉及读取 String 的正文 javax.jms.TextMessage 并将其作为 javax.jms.BytesMessage 复制到 byte[] 的正文。但是,您将同时在内存中拥有 2 个数据副本,这似乎正是您要避免的。

如果您有另一个可以访问更多内存的环境,那么您可以编写一个应用程序,该应用程序的唯一工作是转换这些消息,然后将它们发送到一个新队列,然后您的内存受限应用程序可以阅读它们。

,

你的问题有点奇怪。

我安装了 Raspberry Pi 4 with IBM MQ v9.2.1,并在 Raspberry Pi 4 上创建了 2 个队列管理器。我在 Raspberry Pi 4(本地运行)上安装了 MQ Visual Edit for Raspberry Pi。我可以使用 MQ Visual Edit 针对本地运行的队列管理器获取和放置消息(本地)。我尝试了 1MB、10MB 和 100MB 的消息大小而没有耗尽内存。

注意:MQ Visual Edit 是一个 Java/MQ 应用程序。

所以,如果一个简单的 Raspberry Pi 可以处理它,那么我想知道您的配置。

您是否使用“-Xmx”的 JVM 参数来增加 JVM 将使用的最大内存量?为什么不尝试使用“-Xmx1024”,看看它是否运行正常。