从队列的挂起消息列表中获取消息时的性能问题

时间:2015-07-24 15:00:36

标签: java jms activemq qpid

队列服务器:ActiveMQ, 议定书:AMQP API:Apache QPID客户端JMS 0.3.0

在正常情况下,它对我来说很好,并在几毫秒内获取消息。

面对以下情况中的问题:

  1. 假设队列名称:TESTQUEUE
  2. 它在队列中有500条待处理消息,带有JMSCorrelationID
  3. 使用qpid API使用JMSCorrelationID获取消息。
  4. 检索邮件大约需要25秒。

    在这种情况下我该怎么做?

        // LOGIC: declaration
        Connection connection = null;
        MessageConsumer consumer = null;
        MetaData objMetaData = new MetaData();
        String strReturnData = "";
        String user = "";
        String password = "";
        String host = "";
        int port = 0;
        ConnectionFactoryImpl factory = null;
        Session session = null;
        Destination destination = null;
        Message msg = null;
    
        try {
    
            // LOGIC: set the connection details
            user = objMetaData.getMetaData(CommonConstant.QUEUE_USERNAME);
            password = objMetaData.getMetaData(CommonConstant.QUEUE_PASSWORD);
            host = objMetaData.getMetaData(CommonConstant.QUEUE_HOST);
            port = Integer.parseInt(objMetaData.getMetaData(
                    CommonConstant.QUEUE_PORT).trim());
    
            // LOGIC: Initialize the connection factory with connection details
            factory = new ConnectionFactoryImpl(host, port, user, password, strCorelationId);
    
            // LOGIC: create connection
            connection = factory.createConnection();
    
            // LOGIC: create session
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    
            // LOGIC: initialize destination with queue name
            destination = (Destination) session.createQueue(strQueueName);
    
            // LOGIC: open connection
            connection.start();
    
            // LOGIC: set correlation id
            consumer = session
                    .createConsumer(
                            destination,"JMSCorrelationID ='"+ strCorelationId + "'");
    
            // LOGIC: get message
            if (blnIsRequestModeSync) {
                msg = consumer.receive((1000 * 60 * 2));
            } else {
                msg = consumer.receive(30000);
            }
    
            // LOGIC: check message type
            if (msg instanceof TextMessage) {
    
                // LOGIC: when text message
                TextMessage txtmsg = (TextMessage) msg;
                //System.out.println("TEXT MSG: " + txtmsg.getText());
                strReturnData = txtmsg.getText();
            } else {
                // LOGIC: when object message
                ObjectMessage objmsg = (ObjectMessage) msg;
                //System.out.println("Object  MSG:" + objmsg);
                strReturnData = (null != objmsg ? objmsg.toString() : "");
            }
    

1 个答案:

答案 0 :(得分:0)

没有足够的信息可以为您提供明确的答案,但有一些事情可以在这里发挥作用。

首先,您在队列中有多个消费者,并且消息正在根据他们到达的时间被预取,以便第一个消费者持有第二个等感兴趣的消息,等等。您可以尝试减少客户端上的预取以规则出来。

第二个是队列深度足够大,以至于客户端感兴趣的消息更深入到队列中,ActiveMQ使用默认页面大小将消息保存在内存中,这意味着客户端无法接收它的消息,直到其他消费者拉出足够的消息,使你的慢客户感兴趣的内存供选择。您可以在per-destination的基础上调整ActiveMQ使用的页面大小。但是,您应该考虑自己警告深度队列中的选择器是消息反模式,并且容易出现这些类型的问题。