我的目的是列出 Java 应用程序中一组 MQ 队列中消息的相关 ID。
这是代码片段
public void populateCorrelationIds() throws MQException{
int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INQUIRE | MQConstants.MQOO_BROWSE;
String qNames[0] = BAY10.CISCHGX.DFDA;
String qNames[1] = BAYSF11.MSFCHGX.DFDA;
MQMessage messageGet = new MQMessage();
for(String q : qNames){
MQQueue dfdaQ = qMgr.accessQueue(q, openOptions);
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQConstants.MQGMO_BROWSE_FIRST| MQConstants.MQGMO_WAIT;
gmo.waitInterval = 4000;
int j = dfdaQ.getCurrentDepth();
for(int i=0;i<j;i++)
{
dfdaQ.get(messageGet,gmo); //Error generated here when getting message for qNames[1]
byte[] correlId= messageGet.correlationId;
}
}
}
下面是我收到的错误 -
MQJE001: Completion Code '2', Reason '2033'. com.ibm.mq.MQException:
MQJE001: Completion Code '2', Reason '2033'. at
com.ibm.mq.MQDestination.getInt(MQDestination.java:655) at
com.ibm.mq.MQDestination.get(MQDestination.java:459) at
Utility.populateCorrelationIds(Utility.java:152) at
Utility.main(Utility.java:64) MQJE001: Completion Code '2', Reason '2033'.
这是我运行代码时遇到的错误。请注意,当我从下一个队列的队列中获取消息时,会发生错误。我成功地浏览了第一个队列的所有消息。但是,当我浏览第二个队列中的第一条消息时,我就会收到上述错误。任何人都可以帮助解决此错误。
最佳答案
这里有几点需要注意:
第一个是因为你正在初始化MQMessage
第一个之外的对象 for
环形。它必须在第二个 for
内循环,因为 MQ 用 MessageId
填充该对象, CorrelationId
、消息正文等,当MQQueue.get
时调用返回。如果你做get
再次调用相同的 MQMessage
对象实例,您实际上正在尝试使用先前检索到的消息的 MessageId 来获取消息。此调用失败,原因代码为 2033。
关于您的代码还有一些其他要点。
1) 你必须做 new MQGetMessageOptions()
在第二个for
内循环。
2) 您正在使用 BROWSE_FIRST 选项。这将仅浏览第一条消息。要浏览所有消息,您必须执行 get
与 BROWSE_NEXT
选项。当您打开队列时,浏览光标逻辑上位于队列中第一条消息之前。这意味着如果您将 get
您调用 accessQueue
后立即调用调用电话,您可以使用MQGMO_BROWSE_NEXT
浏览第一条消息的选项;您不必使用MQGMO_BROWSE_FIRST
选项
3) 如果为 browse
打开队列仅此,则无需指定 MQConstants.MQOO_OUTPUT | MQConstants.MQOO_INQUIRE
打开选项。
4) getCurrentDepth() 方法返回调用时的队列深度。当您的应用程序正在浏览时,其他一些应用程序可能会从同一队列获取消息。在这种情况下,当前队列深度将会更改,但您的应用程序不会收到更改通知。所以不要使用 dfdaQ.getCurrentDepth()
,你可以简单地使用 MQGMO_BROWSE_NEXT
来获取while
中的选项环形。当没有消息可供浏览时,get 调用将返回 2033 原因代码。您可以检查此原因代码并退出 while 循环。
关于java - 如何在同一个函数中浏览来自2个不同MQQueue的所有消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29460341/