【问题标题】:is IBM MQ Message Segmentation possible using JMS?是否可以使用 JMS 进行 IBM MQ 消息分段?
【发布时间】:2011-12-29 09:18:01
【问题描述】:

是否可以使用 JMS 实现消息分段,就像使用 Native IBM API 作为shown here 一样。我读过的一种可能的解决方案是 JMS 的消息分组。是否有人使用 JMS 使用此替代解决方案来分割分段?

【问题讨论】:

  • 你看消息分割的原因是什么?您发送的信息是否太大?消息分组基本上是消息的分组,它们之间的某种关系以及组中的所有消息都需要处理。
  • 嗨 Shashi - 可以通过队列传输的消息大小有 5mb 的限制(这是一个架构策略)。这意味着大于 5Mb 的文件必须在执行 MQ put 之前以某种方式进行分段。

标签: jakarta-ee jms ibm-mq


【解决方案1】:

我使用 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.classcom.ibm.mq.jmqi.MQGMO.class 类的重复项。

【讨论】:

  • 虽然这可能有效,但它非常笨拙。如果您必须向 IBM 打开支持案例,由于您对 ibm 提供的 jar 文件所做的修改,他们可能不会为您提供支持,并且您必须对出现的任何新版本的 IBM 提供的 jar 文件执行相同的修改。
【解决方案2】:

不,这不是分段。那就是分组。它很相似,但也没有使用 JMS。据我所知,IBM 的 JMS 实现不支持分段。

【讨论】:

    【解决方案3】:

    是的,您可以使用 JMS 实现消息分段,如 here. 所述

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      相关资源
      最近更新 更多