我使用 IBM 的 JMS 实现为这个问题找到了一些肮脏的解决方案。我没有从我的应用程序中找到解决方案,但您可以在您使用的 MQ 版本的 com.ibm.mq.jmqi.jar 中执行此操作(对我来说是 9.0.0.0)
接收片段作为完整消息
要从 MQ 接收完整消息,您需要将 MQGMO_COMPLETE_MSG 标志设置为 GMO.Options。
首先您需要找到并反编译com.ibm.mq.jmqi.MQGMO.class(我使用IntelliJ 完成,或者您可以使用一些反编译器,例如http://java-decompiler.github.io/ 或网络反编译器http://www.javadecompilers.com)。
然后对于设置 GMO.Options 的每个调用,您需要添加 MQGMO_COMPLETE_MSG 标头,只需将 MQGMO.java 中的方法 setOptions 替换为以下代码:
public void setOptions(int var1) {
var1 = var1 & -4097 | 65536;
if (Trace.isOn) {
Trace.data(this, "com.ibm.mq.jmqi.MQGMO", "setOptions(int)", "setter", var1);
}
this.options = var1;
}
您需要替换版本字段的值 - private int version = 2;。
然后你需要重新编译这个类,你可以使用命令"path_to_jdk_folder\bin\javac" -classpath com.ibm.mq.jmqi.jar MQGMO.java。
最后一步您需要将MQGMO.class 放入com.ibm.mq.jmqi.jar,您可以使用命令"path_to_jdk_folder\bin\jar" uf com.ibm.mq.jmqi.jar com/ibm/mq/jmqi/MQGMO.class 执行此操作。文件系统中所需的路径 com/ibm/mq/jmqi/MQGMO.class 以将类正确放置在 com.ibm.mq.jmqi.jar 中。
小心并检查类是否真的被替换了。
现在,您可以将修补的 jar 放到应用程序的类路径中,并检查您是否可以从队列中接收到已完成的消息。
将大消息作为分段发送
要发送大型消息并告诉 IBM MQ 对它们进行分段,您需要设置 MQMD 标志 - MQMF_SEGMENTATION_ALLOWED。
首先你需要找到并反编译com.ibm.mq.jmqi.MQMD.class(怎么做 - 看前面的部分)。
那么你需要在一些字段中设置值而不是现有的:
private int msgFlags = 1;
private int version = 2;
字段 msgType = 2 正在将属性 MQMF_SEGMENTATION_ALLOWED 设置为所有传出消息。
那么你需要像上一部分那样重新编译这个类,然后放到com.ibm.mq.jmqi.jar中。
您可以通过将大消息放入具有小消息长度限制的队列来验证此解决方案。
小心
请注意,您的应用程序的类路径中没有 com.ibm.mq.jmqi.MQMD.class 和 com.ibm.mq.jmqi.MQGMO.class 类的重复项。