问题描述
我目前正在使用 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”,看看它是否运行正常。