我当前的应用程序逻辑使用“PROCESS”WMQ队列的深度来确定IIB9工作流程是否正在处理作业。如果工作流正在处理消息,则应用程序将等待该工作流结束。工作流结束后,“PROCESS”队列将使用GET操作清空,应用程序将按顺序发送其他消息进行处理。我正在使用JMS选择器来区分工作流并行处理的多个消息。
问题在于确定队列的深度。 JMS API将深度设置为0,而IBM API将深度设置为1(这是预期的)。不幸的是,我不能使用IBM API作为我的逻辑使用一些复杂的messageselectors。
有没有人见过这种奇怪的行为?请注意,在进行尺寸检查时,IIB9工作流程正在进行中。有没有可以调整的设置?
JMS代码(为清晰起见,删除了消息选择器):
public class QDepthJMS {
public static void main(String[] a) throws Exception {
MQConnectionFactory factory = new MQConnectionFactory();
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
factory.setQueueManager("QM01");
factory.setHostName("10.10.98.15");
factory.setPort(1414);
factory.setChannel("Java.Clients");
MQConnection connection = (MQConnection) factory.createConnection();
connection.start();
MQSession session = (MQSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MQQueue queue = (MQQueue) session.createQueue("queue:///PROCESS");
MQQueueBrowser browser = (MQQueueBrowser) session.createBrowser(queue);
Enumeration<Message> msgs = browser.getEnumeration();
int count =0;
if (msgs.hasMoreElements()) {
msgs.nextElement();
++count;
}
System.out.println(count);
}
}
IBM API(Check MQ queue depth):
public class QDepth {
private final String host;
private final int port;
private final String channel;
private final String manager;
private final MQQueueManager qmgr;
public QDepth(String host, int port, String channel, String manager) throws MQException {
this.host = host;
this.port = port;
this.channel = channel;
this.manager = manager;
this.qmgr = createQueueManager();
}
public int depthOf(String queueName) throws MQException {
MQQueue queue = qmgr.accessQueue(queueName, MQC.MQOO_INQUIRE | MQC.MQOO_INPUT_AS_Q_DEF, null, null, null);
return queue.getCurrentDepth();
}
@SuppressWarnings("unchecked")
private MQQueueManager createQueueManager() throws MQException {
MQEnvironment.channel = channel;
MQEnvironment.port = port;
MQEnvironment.hostname = host;
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
return new MQQueueManager(manager);
}
public static void main(String[] a) throws Exception {
QDepth qd = new QDepth("10.10.98.15, 1414, "Java.Clients", "QM01");
System.out.println(qd.depthOf("PROCESS"));
}
}
答案 0 :(得分:2)
你不是在比较&#34;喜欢与喜欢&#34; - IBM API查询队列深度,即队列中有多少消息,但JMS API正在浏览消息并对其进行计数。他们有不同的正当理由 - 通常的原因是有人在工作单元(同步点)下放置了一条消息而且尚未提交 - 因此,当您运行IBM API时,它会在那里说#39;队列中的1条消息(有...)但由于尚未提交,因此无法获取/可浏览。
您可以通过runmqsc DIS QSTATUS使用runmqsc(可能还有GUI)验证这一点并查看UNCOM属性 - 请参阅http://www-01.ibm.com/support/docview.wss?uid=swg21636775