Java 使用IBM Websphere MQ JMS的客户端接收退出

Java 使用IBM Websphere MQ JMS的客户端接收退出,java,jms,ibm-mq,Java,Jms,Ibm Mq,我正在尝试用java实现receive exit,如下所述: 我看到调用了exit方法,在下面的文档中,我希望agentBuffer包含传入消息的数据。但是agentBuffer每次都显示为null,因此我看不到任何影响消息数据的方法 任何线索都将不胜感激 UPD 我错了agentBuffer总是空的,不是。在T.Rob回答之后,我设法用MQCXP.ExitReason=14(MQXR_XMIT)捕获了几个调用。 通过其中一个调用,我在缓冲区中接收消息数据,并且看起来可以修改这些数据。 但是,

我正在尝试用java实现receive exit,如下所述:

我看到调用了exit方法,在下面的文档中,我希望agentBuffer包含传入消息的数据。但是agentBuffer每次都显示为null,因此我看不到任何影响消息数据的方法

任何线索都将不胜感激

UPD 我错了agentBuffer总是空的,不是。在T.Rob回答之后,我设法用MQCXP.ExitReason=14(MQXR_XMIT)捕获了几个调用。 通过其中一个调用,我在缓冲区中接收消息数据,并且看起来可以修改这些数据。 但是,其他调用仍然存在一个问题,它们具有相同的ExitReason,但不对应于任何实际的消息传输。我需要跳过这样的电话,但却不知道如何区分它们


你知道我该怎么做吗?

MQ中有几种通道出口。当整个消息在缓冲区中时,MCA通道(QMgr到QMgr)使退出点可用。此出口点调用消息出口。所有通道、MCA和MQI(客户端)都使发送/接收出口点可用。无论何时调用从一个通道代理到另一个通道代理的传输,都会执行发送/接收出口点

在客户端通道的情况下,可以为不包括消息传输的流调用接收出口,或者为单个消息多次调用接收出口。由程序检查以确定通过客户端通道的API调用,以及代理缓冲区在该时间点是否应该包含任何内容

请注意,发送和接收出口通常成对工作。由于队列管理器不从MCA调用Java程序,因此队列管理器端的任何相应发送或接收出口都将用C编写


有关更多信息,请参阅上的手册页。

在MQ中编写出口代码非常困难,需要深入了解MQ。SVRCONN/CLNTCONN通道对上有双向通信流,您看不到整个消息(除非小于32758字节)。您在通道发送/接收出口中看到的是传输段头(TSH)消息。注意:IBM没有记录TSH消息

MCA(消息通道代理)为MQXR \***定义的各种“ExitReason”调用通道发送/接收出口

但是agentBuffer每次都显示为null,所以我看不出有什么方法可以修改它 影响消息数据

这是因为您不了解MQ,也不了解双向通道的流。您知道TSH消息是二进制的而不是纯文本的!?!对吗?您是以十六进制转储/打印缓冲区还是执行System.out.println??如果是后者,那么请看我在这篇文章中的第一句话

使用调试器并查看TSH数据。请不要问为什么要看奇怪的东西,正如我所说的,TSH消息并没有被IBM记录!如果你想要信息,那么去看看Wire Shark的代码,因为他们已经对TSH消息进行了反向工程

最后,为什么要编写通道发送/接收出口,因为除了使用出口外,还有许多其他方法可以查看消息流

  // This method implements the receive exit interface
  public ByteBuffer channelReceiveExit(MQCXP channelExitParms,
                                   MQCD channelDefinition,
                                   ByteBuffer agentBuffer)
 {
  // Complete the body of the receive exit here
 }