JMS和IBM WebSphere不生成COD

JMS和IBM WebSphere不生成COD,jms,ibm-mq,Jms,Ibm Mq,我正在创建一个应用程序,该应用程序使用JMS使用来自MQ的消息。我的MQ管理器是IBM WebSphere MQ,我正在使用IBM jms实现来使用消息 消息传来传去很顺利。我接收来自另一方的消息,我可以向他们发送消息。问题是,在我使用队列中的消息之后,他们没有收到COD。他们收到了COA,但没有COD 这是我的接收消息代码: public byte[] readMsgFromClient() throws JMSException { byte[] message = null

我正在创建一个应用程序,该应用程序使用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我的应用程序已经使用了该消息?

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

下面是另一个你通过艰苦的方式学到的东西:

  • COA消息在队列管理器的用户ID下生成
  • COD消息是在发件人消息的用户ID下生成的
如果发送应用程序的用户ID为appl001,则将使用appl001的用户ID生成COD。如果该用户ID没有写入特定队列的权限,则消息将在DLQ中结束

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


因此,发件人的用户ID没有将消息放入远程队列管理器的权限。

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

下面是另一个你通过艰苦的方式学到的东西:

  • COA消息在队列管理器的用户ID下生成
  • COD消息是在发件人消息的用户ID下生成的
如果发送应用程序的用户ID为appl001,则将使用appl001的用户ID生成COD。如果该用户ID没有写入特定队列的权限,则消息将在DLQ中结束

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


因此,发件人的用户ID没有将消息放入远程队列管理器的权限。

如@Roger所述,放入COD的权限基于发送消息的MQMD中的用户ID

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

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

MSGEXIT('itsoME(MsgExit)')
MSGDATA('MCA/')
结果是MQMD的UserIdentifier字段将更改为通道上配置的MCAUSER的值。然后将MCAUSER+put和+passid提供给返回到远程队列管理器的XMITQ


如果您不想允许COA/COD,则可以将出口用于其他用途,例如删除报告选项。

如@Roger所述,放置COD的权限基于发送消息的MQMD中的用户ID

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

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

MSGEXIT('itsoME(MsgExit)')
MSGDATA('MCA/')
结果是MQMD的UserIdentifier字段将更改为通道上配置的MCAUSER的值。然后将MCAUSER+put和+passid提供给返回到远程队列管理器的XMITQ


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

奇怪的是,另一部分询问了很多DLQ是否有任何消息,但它是空的,DLQ没有消息。你还认为可能是权限问题吗?无论如何,我会和负责权限管理的部门谈谈。谢谢你的快速回复!奇怪的是,另一部分问了很多DLQ是否有消息,但它是空的,DLQ没有消息。你还认为可能是权限问题吗?无论如何,我会和负责权限管理的部门谈谈。谢谢你的快速回复!提供的答案中有一个解决了你的问题吗?没有。COA不是由MQ发送的,而是很久以前在glaxy遥远的地方有人制作了一个DLL来响应COA。IBM MQ 7.5知识中心页面“”表示COA和COD消息都是由队列管理器生成的。我不知道动态链接库是怎么来的?我也是!我不知道他们是怎么做到的,但似乎永远都是这样做的,当我们让队列管理器自己处理它时,COA从未发送,只有COD。我们搜索了队列和通道的配置,但没有关于COA或COD的信息。很抱歉,我无法提供更多帮助。请注意,COA/COD是根据消息发送时MQMD中设置的报告选项生成的。如果未设置COA报告选项,则队列管理器将不会生成该选项。您可以使用示例amqsbcg查看消息上的报告选项。如果应用程序正在发送COA/COD报告选项,则MQ应作出响应。我有点不清楚,你的问题说没有发送COD,他们只收到COA,但在你的评论中,你说COA从来没有只发送COD。我的回答与COD有关。我首先要检查哪些报告选项