【问题标题】:JMS and IBM WebSphere not generating CODJMS 和 IBM WebSphere 不生成 COD
【发布时间】:2017-09-22 23:27:54
【问题描述】:

我正在创建一个使用 JMS 使用来自 MQ 的消息的应用程序。我的 MQ 管理器是 IBM WebSphere MQ,我正在使用 IBM jms 实现来使用消息。

消息来来去去都很好。我收到来自另一方的消息,我可以向他们发送消息。问题是在我使用队列中的消息后他们没有收到 COD。他们收到 COA,但没有 COD。

这是我的接收信息代码:

public byte[] readMsgFromClient() throws JMSException {
        byte[] message = null;
        QueueReceiver reader = null;
        try {
            connection = getQueueConnection();
            connection.start();
            session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            Queue queue = session.createQueue(config.getQueueRsp());

            ((MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);

            reader = session.createReceiver(queue);

            JMSBytesMessage byteMessage = (JMSBytesMessage) reader.receive(3000);

            if (byteMessage != null) {
                message = new byte[(int) byteMessage.getBodyLength()];
                byteMessage.readBytes(message);
            }
        } finally {
            if (reader != null) {
                reader.close();
            }

            if (session != null) {
                session.close();
            }

            if (connection != null) {
                connection.close();
            }
        }

        return message;
    }

我必须手动发送 COD 吗?我是否必须将我的 WebSphere 配置为自动发送 COD?我是否必须通知 WebSphere 我的应用程序已使用该消息?

【问题讨论】:

  • 所提供的任何一个答案都解决了您的问题吗?
  • 不。 COA 不是 MQ 发送的,而是很久以前在一个遥远的星系中制作了一个响应 COA 的 DLL。
  • IBM MQ 7.5 知识中心页面“Types of message”说 COA 和 COD 消息都是 generated by the queue manager。我不确定 DLL 是如何进入其中的?
  • 我也是!我不知道他们是怎么做到的,但它似乎永远都是这样完成的,当我们让队列管理器自己处理它时,从未发送过 COA,只有 COD。我们搜索了队列和通道的配置,但没有关于 COA 或 COD 的内容。抱歉,我不能提供更多帮助。
  • 请注意,COA/COD 是根据消息发送时在 MQMD 中设置的报告选项生成的。如果未设置 COA 报告选项,则队列管理器不会生成它。您可以使用示例 amqsbcg 查看消息的报告选项。如果应用程序正在发送 COA/COD 报告选项,那么 MQ 应该做出响应。我有点不清楚你的问题是没有发送 COD,他们只收到 COA,但是在你的 cmets 中你说 COA 从来没有只发送 COD。我的回答与 COD 有关。我会首先检查发送了哪些报告选项。

标签: jms ibm-mq


【解决方案1】:

COD 消息可能以 RC(原因代码)为 2035(未授权)的死信队列 (DLQ) 结束。

以下是另一件你很难学到的东西:

  • COA 消息在队列管理器的 UserId 下生成
  • COD 消息在发件人消息的 UserId 下生成。

如果发送应用程序的 UserId 是 appl001,那么 COD 将使用 appl001 的 UserId 生成。如果该 UserId 没有写入特定队列的权限,则消息将在 DLQ 中结束。

通常,当发送方应用程序连接到一个队列管理器而接收方应用程序连接到另一个队列管理器时,会发生权限问题。即消息在队列管理器之间传递。

因此,发件人的 UserId 无权将消息放在远程队列管理器上。

【讨论】:

  • 奇怪的是对方问了很多DLQ有没有消息,但是是空的,DLQ有0个消息。您仍然认为这可能是权限问题吗?无论如何,我会与持有权限管理的部门联系。感谢您的快速回复!
【解决方案2】:

正如@Roger 所说,放置 COD 的权限基于所发送消息的 MQMD 中的 UserId。

如果您不想将远程用户添加到本地系统,您可以使用 IBM 红皮书“Secure Messaging Scenarios with WebSphere MQ”中提供的 itsoME 出口。最新版本可在“附加材料”链接下找到。

使用此出口,您需要在 RCVR 或 RQSTR 通道上设置 MCAUSER,并使用以下属性配置该通道:

MSGEXIT('itsoME(MsgExit)')
MSGDATA('MCA/')

结果是 MQMD 的 UserIdentifier 字段将更改为在通道上配置的 MCAUSER 的值。然后,您可以将该 MCAUSER +put 和 +passid 提供给返回到远程队列管理器的 XMITQ。

如果您不想允许 COA/COD,则退出可用于其他操作,例如删除报告选项。

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2016-01-09
    • 2019-06-16
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多