当前位置: 首页 > 知识库问答 >
问题:

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

乜建柏
2023-03-14

环境/背景:

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

步骤:

  1. 客户端发送消息并回复至

当没有挂起消息或挂起消息时,上述步骤可以正常工作

<?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);

其他发现:

>

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

有趣的是,在等待超时时,如果我在管理UI上浏览队列,我会得到响应。

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

共有2个答案

邓声
2023-03-14

回答我自己的问题。

我面临的问题正是http://trenaman.blogspot.co.uk/2009/01/message-selectors-and-activemq.html中描述的,解决方案是增加ActiveMQ和maxPageSize中指定的maxPageSize

正如您可以匹配的那样,200不是一个可变的数字,而是maxPageSize的默认值。

更多参考资料:

>

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

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

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

  • 端木桐
    2023-03-14

    在不了解更多信息的情况下,我猜测您有多个消费者,其中一个正在其预取缓冲区中占用消息,我认为默认大小为1000。要调试这样的情况,通常最好查看web控制台或连接jconsole并检查队列MBean,以查看正在传输的消息的统计信息、消费者数量等。

     类似资料:
    • 我有和这里描述的相同的问题:ActiveMQ:一条挂起的消息,但队列是空的。 更多客户端: 与hawtio-相同的行为 我的java消费者 不消耗任何东西 重启后,继续消耗 我们不将消息保存在默认的kaha db中,而是保存在Oracle DB中。我可以在表ACTIVEMQ_MSGS中看到数据库中的待处理消息。 重新启动activeMQ后,所有客户端都按预期工作。在管理控制台中,我可以看到消息,j

    • 我有两个消费者(不同的应用程序)连接到Azure队列。我可以或消息,在消费过程中,我可以或消息。裁判:http://msdn.microsoft.com/en-us/library/azure/hh851750.aspx. 我确定我想使用,然后消息,因为我希望它们在两个应用程序中被接收。我想我应该将队列上的消息生存期设置为10秒,作为删除机制。 然而,由于消息似乎在10秒钟后被删除,因此在这10秒

    • 因此,我使用Spring integration链接JMS和ActiveMQ,如下所示:- 如何使其工作,以便发送到此队列并从中接收消息?请帮忙。

    • 我的代码仍在工作,我可以发送消息并等待消息发送完毕。发送消息的持续时间大约为10秒,这对我不好,因为我的程序需要1秒的间隔才能发送下一条消息。看看以澄清问题。 msg4- msg4、msg3和msg2仍在等待,直到msg1发送/失败。 这是代码sendMessage.java 在我看来。java类 第一条消息已成功发送,但第二条消息等未发送。如何使这些等待直到发送第一条消息?

    • ActiveMQ:5.10.2在ServiceMix的Karaf OSGi中 卡哈布坚持。 默认代理设置。连接中的默认设置(TCP://x.x.x.x.x:61616) 一切正常,但是:如果我将消费者的数量减少到1(或者2或3个,我不知道阈值在哪里),那么来自1个队列的消息将被消耗,来自另一个队列的消息将被存储。过了一段时间,我看到了这张照片: 1用户停止接收消息。他认为没有更多消息了。 从act

    • 我对Azure服务总线队列还比较陌生,正在构建一个项目,该项目需要按照消息到达的顺序(FIFO)处理队列中的消息。 使用微软的文档,我能够理解这一部分。据我所知,我需要为队列打开会话? 我所面临的困难是确定对队列执行以下一组有序任务的最佳方法/服务堆栈。 首先,让我们假设我们有一个基于先进先出的服务总线队列,它有n个消息。我怎么可能: 从队列中拾取第一条消息。 使用Azure函数处理消息。 将有效