可以像使用Native IBM作为shown here那样使用JMS实现消息分割吗?我读到的一个可行的解决方案是JMS的消息分组。是否有人使用JMS作为细分的替代解决方案?
发布于 2011-11-22 11:42:23
是的,您可以使用JMS实现消息分割,如here.所述。
发布于 2013-06-22 00:40:58
不,那不是分割。这就是分组。它很相似,但它也没有使用JMS。据我所知,在IBM的JMS实现中不支持分段。
发布于 2019-09-26 18:49:57
我使用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.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;
}并且需要替换version-field - 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.jar中正确放置类所需的文件系统中的路径com/ibm/mq/jmqi/MQGMO.class。
要小心,检查类是否真的被替换了。
现在,您可以将打过补丁的jar放到应用程序的类路径中,并检查是否可以从队列接收完整的消息。
以段的形式发送大消息
要发送大消息并告诉IBM MQ对它们进行分段,需要设置MQMD flag - MQMF_SEGMENTATION_ALLOWED。
首先,您需要查找并反编译com.ibm.mq.jmqi.MQMD.class (如何执行此操作-请参阅上一部分)。
然后,您需要在一些字段中设置值,而不是现有的:
private int msgFlags = 1;
private int version = 2;Field msgType = 2正在将属性MQMF_SEGMENTATION_ALLOWED设置为所有传出消息。
然后,您需要像上一部分一样重新编译这个类,并将其放入com.ibm.mq.jmqi.jar中。
您可以通过将大消息放入具有小消息长度限制的队列中来验证此解决方案。
注意
请注意,应用程序的类路径中没有重复的com.ibm.mq.jmqi.MQMD.class和com.ibm.mq.jmqi.MQGMO.class类。
https://stackoverflow.com/questions/8134485
复制相似问题