接收消息的JMS-MQ错误代码2024-来自队列的消息不会被删除

时间:2017-10-03 11:45:52

标签: java-ee jms ibm-mq

我正在使用websphere应用服务器8.5

我试图从队列中接收消息。队列可能包含多条消息。我想立刻阅读所有内容。

我用compcode' 2'重新发现错误WebSphere MQ调用失败。 (' MQCC_FAILED')原因' 2024' (' MQRC_SYNCPOINT_LIMIT_REACHED')虽然我阅读了消息。

  1. 我应该调用session的commit()方法吗?如果是这样,我应该在每个消息的循环中或在while循环之外调用内部?

  2. createQueueSession(true,0):在生产者和消费者端,在此方法中传递的参数是否会有任何更正?

  3. 方法

    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();
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:2)

队列管理器有一个参数MAXUMSGS,它是任何客户端的最大未提交消息,默认值为10000。当您收到MQRC_SYNCPOINT_LIMIT_REACHED时,这表示您已达到该限制。

通常,一旦处理完邮件就会提交,在您的示例中,这将是在打印出来之后。由于所有持久性消息都写入磁盘而磁盘可能会减慢速度,因此您可以通过一次提交多条消息来调整性能。请记住,如果您的程序在提交邮件之前崩溃,它们将回滚到队列并在下次启动程序时进行处理,因此您可能希望限制未提交邮件的数量。

由于您使用的是WebSphere Application Server,因此应考虑使用MDB而不是编写自己的MDB。 MDB将连接到队列并等待消息,从队列中读取它们并将它们分派给您自己的onMessage Java方法来处理消息。

我进行了搜索,这里有一些可能有用的链接,我相信您可以找到其他人讨论如何设置MDB:

  1. 克里斯安德鲁斯提出了一个会议“Using IBM WebSphere Application Server and IBM WebSphere MQ Together
  2. Craig St. Jean有一篇博客文章“WebSphere 8.5, MQ, Spring, and Message-Driven Beans! Part 1