我正在使用websphere应用服务器8.5
我试图从队列中接收消息。队列可能包含多条消息。我想立刻阅读所有内容。
我用compcode' 2'重新发现错误WebSphere MQ调用失败。 (' MQCC_FAILED')原因' 2024' (' MQRC_SYNCPOINT_LIMIT_REACHED')虽然我阅读了消息。
我应该调用session的commit()方法吗?如果是这样,我应该在每个消息的循环中或在while循环之外调用内部?
createQueueSession(true,0):在生产者和消费者端,在此方法中传递的参数是否会有任何更正?
方法
import javax.naming.InitialContext;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSession;
import javax.jms.QueueReceiver;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
public class Receiver
{
@Resource(lookup = "jms/ConnectionFactory")
private static QueueConnectionFactory connectionFactory;
@Resource(lookup = "jms/Queue")
private static Queue queue;
public void readQueueMessages() {
try {
// create a queue connection
QueueConnection queueConn = connFactory.createQueueConnection();
// create a queue session
QueueSession queueSession = queueConn.createQueueSession(true, 0);
// create a queue receiver
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
// start the connection
queueConn.start();
// receive a message
while(true) {
TextMessage message = (TextMessage) queueReceiver.receive(180000);
if (message != null) {
if (message instanceof TextMessage) {
// print the message
System.out.println("received: " + message.getText());
} else {
break;
}
} else {
break;
}
}
} catch(JMSException exp) {
// Handle this exception
} finally {
if(queueConn != null) {
// close the queue connection
queueConn.close();
}
}
}
}
答案 0 :(得分:2)
队列管理器有一个参数MAXUMSGS
,它是任何客户端的最大未提交消息,默认值为10000
。当您收到MQRC_SYNCPOINT_LIMIT_REACHED
时,这表示您已达到该限制。
通常,一旦处理完邮件就会提交,在您的示例中,这将是在打印出来之后。由于所有持久性消息都写入磁盘而磁盘可能会减慢速度,因此您可以通过一次提交多条消息来调整性能。请记住,如果您的程序在提交邮件之前崩溃,它们将回滚到队列并在下次启动程序时进行处理,因此您可能希望限制未提交邮件的数量。
由于您使用的是WebSphere Application Server,因此应考虑使用MDB而不是编写自己的MDB。 MDB将连接到队列并等待消息,从队列中读取它们并将它们分派给您自己的onMessage
Java方法来处理消息。
我进行了搜索,这里有一些可能有用的链接,我相信您可以找到其他人讨论如何设置MDB: