【问题标题】:Is it possible to convert a JMS TextMessage to a BytesMessage?是否可以将 JMS TextMessage 转换为 BytesMessage?
【发布时间】:2021-09-27 14:43:28
【问题描述】:

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

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

【问题讨论】:

  • 另外,您是否有来自 OutOfMemoryErrors 的堆转储?如果是这样,是什么占用了大部分内存?
  • 我相信主要是TextMessage对象
  • 您是否尝试过消除 Spring 并直接使用 JMS API?这可能会释放足够的内存来做你需要的事情。
  • 这里有什么反馈吗?
  • 您好,很抱歉,我试图为您的答案投票,但显然我没有足够的积分来做到这一点。目前,我正在尝试您不使用弹簧启动应用程序的其他建议。谢谢!

标签: java jms ibm-mq mq


【解决方案1】:

在技术上可以转换消息,但如果你在内存有限的环境中这样做,它几乎肯定不会帮助你。

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

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

【讨论】:

    【解决方案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”看看能不能正常运行。

    【讨论】:

    • 嗨 Roger,实际上我需要 spring boot 应用程序在 40MB 内运行。我已经设置了属性 -Xmx40m
    • 大多数运行 hello world 应用程序的 JVM 将使用 20MB 到 25MB。现在添加一个 JMS 框架和 Spring Boot,我看不出它会如何在 40MB 内运行。为什么要将最大内存设置为极低的值?
    猜你喜欢
    • 2012-06-06
    • 2017-12-01
    • 2015-10-12
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2018-11-21
    • 2010-09-28
    相关资源
    最近更新 更多