如何从 WMQTextMessage.java 获取 ByteBuffer 主体而不是调用 getText()?

How can I get ByteBuffer body from WMQTextMessage.java instead of calling getText()?

我有一个 Spring 引导应用程序,它正在使用 JMS API 侦听 IBM MQ。该应用程序 运行 处于内存严重受限的环境中。

我收到一个 TextMessage 对象。我可以调用 getText() 并以 String 形式获取消息内容,但此 String 实际上是从 WMQTextMessage.java 中已存在的 ByteBuffer 创建的。因此,我不想调用 getText(),因为从 ByteBuffer 创建新的 String 会占用更多内存。

相反,我想直接从 WMQTextMessage.java 获取 ByteBufferWMQTextMessage.java里面有一个方法叫做public byte[] _exportBody,但是我觉得不能调用这个方法。

有人可以帮我解决这个问题吗?这是我的简单代码:

@JmsListener()
public void messageListener (TextMessage message) {
   String data = message.getText(); //need to avoid this and get data in byte[] to save space
}

如果 _export()WMQTextMessage 上的 public 方法,那么您应该能够将 TextMessage 转换为 WMQTextMessage 并调用它没问题,例如:

@JmsListener()
public void messageListener (TextMessage message) {
   byte[] data = ((WMQTextMessage)message)._export();
}

然而,由于 _export() 方法 returns a byte[]not a ByteBuffer 那么几乎可以肯定 ByteBuffer中的数据复制到新的byte[]中,因此会像调用getText().

一样使用额外的堆

据我所知,IBM MQ 是闭源的。如果您正在反编译客户端 jar 以实际查看 WMQTextMessage.java,那么您可能违反了与 IBM 甚至 DMCA 的软件许可协议。对于如此无害的事情来说,这听起来可能很愚蠢,但是围绕技术的法律往往很愚蠢,因为编写这些法律的人通常一开始并不了解技术的细微差别。我建议您直接与 IBM 合作以获得这些具体问题的答案。