【发布时间】:2015-10-14 00:34:14
【问题描述】:
我想按顺序从 Websphere MQ 组中读取 10000 条消息,我正在使用下面的代码来做同样的事情,但是读取所有消息需要很长时间。即使我尝试使用多线程概念,但有时 2 个线程正在消耗相同的组并且发生竞争条件。下面是代码sn-p。 我正在尝试使用 3 个线程从 MQ 顺序读取 10000 条消息,但我的两个线程同时访问同一个组。如何避免这种情况?顺序读取大量消息的最佳方法是什么?我的要求是我想顺序阅读 10000 条消息。请帮忙。
MQConnectionFactory factory = new MQConnectionFactory();
factory.setQueueManager("QM_host")
MQQueue destination = new MQQueue("default");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
MessageConsumer lastMessageConsumer =
session.createConsumer(destination, "JMS_IBM_Last_Msg_In_Group=TRUE");
TextMessage lastMessage = (TextMessage) lastMessageConsumer.receiveNoWait();
lastMessageConsumer.close();
if (lastMessage != null) {
int groupSize = lastMessage.getIntProperty("JMSXGroupSeq");
String groupId = lastMessage.getStringProperty("JMSXGroupID");
boolean failed = false;
for (int i = 1; (i < groupSize) && !failed; i++) {
MessageConsumer consumer = session.createConsumer(destination,
"JMSXGroupID='" + groupId + "'AND JMSXGroupSeq=" + i);
TextMessage message = (TextMessage)consumer.receiveNoWait();
if (message != null) {
System.out.println(message.getText());
} else {
failed = true;
}
consumer.close();
}
if (failed) {
session.rollback();
} else {
System.out.println(lastMessage.getText());
session.commit();
}
}
connection.close();
【问题讨论】: