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

时间:2015-03-27 20:15:54

标签: java jms ibm-mq

我试图在java中实现接收退出,如下所示: http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.0.1/com.ibm.mq.csqzaw.doc/jm11171_.htm

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

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

任何线索都将不胜感激。

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

知道我该怎么做?

2 个答案:

答案 0 :(得分:4)

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

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

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

有关详细信息,请参阅Channel send and receive exit programs上的手册页。

答案 1 :(得分:2)

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

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

  

但是agentBuffer每次都显示为null,所以我认为没办法   影响消息数据。

那是因为你不了解MQ,也不理解双向通道的流程。您确实意识到TSH消息是二进制而不是纯文本!?!对?你是在HEX中转储/打印缓冲区还是在做System.out.println?如果后者在这篇文章中看到我的第一句话。

使用调试器并查看TSH数据。请不要问为什么你正在寻找奇怪的东西,正如我所说,IBM没有记录TSH消息!如果您需要信息,请查看Wire Shark的代码,因为他们已经反向设计了TSH消息。

最后,为什么要编写频道发送/接收出口,因为有许多其他方法可以完成查看消息流而不是使用退出。