是否可以使用JMS实现消息分段,就像使用Native IBM API一样,如下所示。我读到的一个可能的解决方案是JMS的消息分组。是否有人使用JMS作为分割的替代解决方案?
是的,您可以像这里描述的那样使用JMS实现消息分段。
不,这不是细分。这是分组。它是类似的,但也没有使用JMS。据我所知,IBM的JMS实现中不支持分段。
我找到了一些使用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/或web反编译器http://www.javadecompilers.com)。
设置GMO的每次呼叫。您需要添加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;
}
您需要替换version-field - private int version = 2;
的值
那么你需要重新编译这个类,你可以使用"path_to_jdk_folderbinjavac" -classpath com.ibm.mq.jmqi.jar MQGMO.java
命令。
最后一步,您需要将MQGMO.class
放入com.ibm.mq.jmqi.jar
,您可以使用"path_to_jdk_folderbinjar" 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
类