【问题标题】:Converting JMS Message to IBM PCF将 JMS 消息转换为 IBM PCF
【发布时间】:2015-06-05 13:50:55
【问题描述】:

我有点纠结。我正在尝试通过 jms 读取 WMQ 的消息,然后将其转换为 pcf 消息进行处理。我只能找到一个关于这方面的资源,它并不是很有帮助 [http://www-01.ibm.com/support/docview.wss?uid=swg21395682 的底部]

我已经尝试在上面的文档中实现该技术,但每次我都要排队

PCFMessage response = new PCFMessage(dataInput);

我抛出 MQRC 3013 - MQRCCF_STRUCTURE_TYPE_ERROR

这是我的代码的样子,也许你能看到我看不到的东西。

BytesMessage message = null;
    do {
        // The consumer will wait 10 seconds (10,000 milliseconds)
        message = (BytesMessage) myConsumer.receive(10000);

        // get the size of the bytes message & read into an array
        int bodySize = (int) message.getBodyLength();
        byte[] data = new byte[bodySize];
        message.readBytes(data, bodySize);

        // Read into Stream and DataInput Stream
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        DataInput dataInput = new DataInputStream(bais);

        // Pass to PCF Message to process
        //MQException.logExclude(new Integer(2079));
        PCFMessage qStatsPcf = new PCFMessage(dataInput);

        session.commit();
        if (message != null) {
            processMessage(qStatsPcf);
        }
    } while (message != null);
    myConsumer.close();

针对 T.Rob 的回答进行了一些更新。 我目前正在运行 MQ 7.0。这是什么类型的东西,我目前无法升级。

至于我想要做什么,我正在从 SYSTEM.ADMIN.STATISTICS.QUEUE 中提取消息,并且我想解析这些信息以用于审计目的。转换为 PCF 消息的原因是我希望从这些消息中提取一些 PCF 参数 - 例如 .getParameter(PCFConstants.MQIAMO_PUTS)

无论如何,我都不会尝试向 MQ 发送消息,只是将消息拉出并处理它们。

【问题讨论】:

  • 您确定您真的收到的是 BytesMessage 而不是 TextMessage?如果是这种情况,QM 的代码页和 java 字符串之间的转换会破坏 PCF。
  • 嗨 Stavr00,我收到了一个 JMSMessage 类:jms_bytes 消息,而不是文本消息。
  • "我当前正在运行 MQ 7.0" 客户端还是服务器?要考虑的最重要的版本是客户端版本,因为这是影响代码的类打包发生的地方。您找到 PCF Java 示例了吗?尽管它们都没有查看事件消息,但所有它们都从命令处理器以 PCF 格式接收响应,因此它们都演示了如何解析和处理入站 PCF 消息。读取命令响应的相同技术同样适用于读取事件消息。我在跳飞机。 4-5 小时后重新上线。祝你好运!
  • 另请参阅您的客户端版本的修复列表。如果那是 v7.0,请注意 PCF 消息的许多问题,包括一个产生 MQRCCF_STRUCTURE_TYPE_ERROR 的问题:www-01.ibm.com/support/docview.wss?uid=swg27014224 至少,如果您无法升级,至少要确保您有修复(在客户端)解决任何看似匹配的 PCF 问题。

标签: java jms ibm-mq


【解决方案1】:

这个问题有几个问题:

  • 没有提及正在使用的 MQ jms 客户端的版本。由于 IBM 已多次重新打包 Java/JMS 类,因此有必要说明您正在使用哪个版本以获得更好的答案。
  • 目前还不清楚您要做什么。 MQ PCF 消息由 MQ 命令服务器处理。消息是一种二进制格式,由名称/类型/值元组的链表组成。如果您的消息正文尚未采用 PCF 名称/类型/值格式,则将其转换为 PCF 消息预计会失败。

由于无法以解决方案的措辞回答问题,因此我将根据您可能正在尝试做什么的疯狂猜测提供一些建议。

  1. 使用现代 MQ 客户端。您链接到的技术说明适用于不支持的 MQ 客户端版本。您需要一个至少是 MQ v7.1,但最好是 v8.0。由于任何版本的 MQ 客户端都适用于任何版本的 MQ,因此请使用最新版本。请记住,您获得的功能基于客户端或服务器上使用的最旧版本的 MQ。 v8.0 客户端无法在 v7.0 QMgr 上获得 v8.0 功能。转到SupportPacs 页面并查找名称为MQC** 的条目。 MQ v8.0 客户端是最新的,它是 SupportPac MQC8。
  2. 如果您真的想将 PCF 消息提交给 MQ 的命令处理器,请实例化一个 PCF Agent 来完成。然后使用 PCF message constructors 之一构造 PCF 消息,该消息可让您指定选择器及其值。
  3. 当您尝试使用 PCF Java 示例时发生了什么?他们也失败了吗?他们工作了吗?如果是这样,您的代码有何不同?您确实查看了 IBM 的 PCF 示例,对吗?有关示例程序(包括 PCF 示例)的位置,请参见 Installation directories for samples
  4. 如果您尝试向 MQ 命令处理器发送消息,请更新问题,让我们知道您正在尝试做什么以及为什么您认为需要 PCF 消息来执行它。

【讨论】:

  • 您好 T.Rob,感谢您的反馈,您有很多有效的观点。我更新了我的问题以反映您的回答。谢谢。
【解决方案2】:

我的 2 美分...

为什么要使用 JMS 来检索 PCF 消息?
MQ Java 最适合处理所有统计信息和事件消息。我的建议是使用 MQQueueManager 对象并从 SYSTEM.ADMIN.STATISTICS.QUEUE 中检索 MQMessage 并将其传递给 PCFMessage 构造函数。 我没有编译或测试以下内容,但它给出了一个大纲。

//no try catch block to keep it simple
//assumed MQQueueManager (qmgr object) is already created
//assumed statQueue is available through qmgr.accessQueue() method
do {
    MQMessage message = new MQMessage();
    //gmo as CMQC.MQGMO_FAIL_IF_QUIESCING | CMQC.MQGMO_WAIT | CMQC.MQGMO_SYNCPOINT | CMQC.MQGMO_CONVERT;
    message = statQueue.get(message, gmo);

    // Pass to PCF Message to process
    PCFMessage qStatsPcf = new PCFMessage(message);

    qmgr.commit();
    if (message != null) {
        processMessage(qStatsPcf);
    }
} while (message != null);

statQueue.close();
qmgr.close();

【讨论】:

  • 我有代码可以做到这一点。 jms 检索主要是一个练习,看看我是否可以让它工作。但看起来只是将消息作为 pcf 将是最简单的方法。
猜你喜欢
  • 2021-01-08
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多