当队列有n个待处理消息时,ActiveMQ不返回消息

时间:2014-08-01 17:54:46

标签: php jms activemq stomp

环境/背景:

使用PHP Stomp库从ActiveMQ发送和接收消息(v5.4.3)。

步骤:

  1. 客户端发送回复邮件&请求队列的相关标头(比如/ queue / request)
  2. 订阅响应队列(比如/ queue / response)
  3. 阅读框架
  4. ACK
  5. 退订
  6. 当没有待处理消息或待处理消息时,上述步骤正常工作< ñ。就我而言,n = 200。当待处理消息的数量是> 200,邮件未送达。进程等待超时,最后超时无响应。我可以在超时后看到消息(使用管理员UI)。这是我在这种情况下使用的代码:

    <?php
    
    // make a connection
    $con = new Stomp("tcp://localhost:61616");
    // Set read timeout.
    $con->setReadTimeout(10);
    
    // Prepare request variables.
    $correlation_id = rand();    
    $request_queue = '/queue/com.domain.service.request';
    $response_queue = '/queue/com.domain.service.response';
    $selector =  "JMSCorrelationID='$correlation_id'";
    $headers = array('correlation-id' => $correlation_id, 'reply-to' => $response_queue);
    $message = '<RequestBody></RequestBody>';
    
    // send a message to the queue.
    $con->send($request_queue, $message, $headers);
    
    // subscribe to the queue
    $con->subscribe($response_queue, array('selector' => $selector, 'ack' => 'auto'));
    
    // receive a message from the queue
    $msg = $con->readFrame();
    
    // do what you want with the message
    if ( $msg != null) {
        echo "Received message with body\n";
        var_dump($msg);
        // mark the message as received in the queue
        $con->ack($msg);
    } else {
        echo "Failed to receive a message\n";
    }
    unset($con);
    

    其他调查结果:

    1. 从一个文件发送消息(比如发件人.php)并使用另一个脚本(比如receiver.php)接收正常工作。

    2. 允许在同一请求队列中发送超过1000条消息(最终处理并放入响应队列)。所以它看起来不像是内存问题。

    3. 有趣的是,在等待超时时,如果我在管理界面上浏览队列,我会收到回应。

    4. 默认情况下,我使用的stomp代理将预取大小设置为1.

2 个答案:

答案 0 :(得分:1)

我不知道更多我的猜测是你有多个消费者而且有一个正在占用预取缓冲区中的消息,我认为默认大小是1000。要调试这样的情况,通常最好查看Web控制台或连接jconsole并检查Queue MBean以查看正在进行的消息的统计信息,消费者数量等。

答案 1 :(得分:1)

回答我自己的问题。

我面临的问题正是http://trenaman.blogspot.co.uk/2009/01/message-selectors-and-activemq.html中描述的问题,解决方法是按照ActiveMQ and maxPageSize

中的规定增加maxPageSize

您可以匹配200不是变数,但默认值为maxPageSize。

更多参考资料:

  1. http://activemq.2283324.n4.nabble.com/Consumer-is-not-able-to-pick-messages-from-queue-td2531722.html

  2. https://issues.apache.org/jira/browse/AMQ-2217

  3. https://issues.apache.org/jira/browse/AMQ-2745