将JMS消息转换为IBM PCF

时间:2015-06-05 13:50:55

标签: java jms ibm-mq

我有点受约束。我试图通过jms读取WMQ的消息,然后将其转换为pcf消息进行处理。我只能在此找到一个资源而且它没有帮助[{3}}的底部]

我尝试在上面的文档中实现该技术,但每次我都行

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发送消息,只需关闭消息并处理它们。

2 个答案:

答案 0 :(得分:4)

这个问题有几个问题:

  • 没有提及正在使用的MQ jms客户端版本的版本。由于IBM多次重新打包Java / JMS类,因此有必要提及您正在使用哪个版本来获得更好的答案。
  • 目前还不清楚你要做的是什么。 MQ命令服务器处理MQ PCF消息。消息是二进制格式,由名称/类型/值元组的链接列表组成。如果您的邮件正文尚未处于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样本,对吗?有关示例程序的位置,请参阅Installation directories for samples,包括PCF样本。
  4. 如果您尝试向MQ命令处理器发送消息,请更新问题以告诉我们您要尝试做什么以及您认为需要PCF消息的原因它。

答案 1 :(得分:1)

我的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();