一次从ActiveMQ消息消息一条消息

时间:2012-11-05 07:29:41

标签: activemq

我想这样做:

  1. ActiveMQ向客户端发送消息。

  2. 客户端在处理完消息后向ActiveMQ发送确认。

  3. 如果客户端关闭或未确认该消息,则此消息将保留在队列中。所有其他消息将不会被传递。

  4. 服务器一次发送一条消息,客户端一次处理一条消息。除非已确认第一条消息,否则将不会传递下一条消息。

  5. 有办法做到这一点吗?

3 个答案:

答案 0 :(得分:0)

听起来您正在寻找的是低{0}或prefetch限制与Ack mode客户确认或个人确认相结合的组合。预取零将使您的客户端本质上是基于拉取的消费者,并且如果客户端未能确认在断开连接时已分派的消息,则将ack设置为客户端将导致代理重新传递消息。

答案 1 :(得分:0)

关于失败的缺点,这就是activeMQ的工作方式。

如果业务逻辑层发生“失败/错误确认”,那么您应该使用transactions

警告不是有效代码(pradigm)

// at your Listener
public void onMessage(Message message)
{
    if (isValid(message))
    {
        connection.ack();
        commit();
        return;
    }
    rollback();
}

关于邮件限制和持久性,以下目标策略配置将对您有所帮助。

    <destinationPolicy>
        <policyMap>
          <policyEntries>
            <policyEntry topic=">" producerFlowControl="true" memoryLimit="10mb">
              <pendingSubscriberPolicy>
                <vmCursor />
              </pendingSubscriberPolicy>
            </policyEntry>
            <policyEntry queue=">" producerFlowControl="true" memoryLimit="10mb">
              <pendingQueuePolicy>
                <vmQueueCursor/>
              </pendingQueuePolicy>
            </policyEntry>
          </policyEntries>
        </policyMap>
    </destinationPolicy>

恕我直言,我也会使用MySQL来实现这种持久性

    <persistenceAdapter>
        <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds"/>
    </persistenceAdapter>

另外,我建议您use Camel根据需要配置throttler

答案 2 :(得分:0)

尝试以下方法......

  • set queue prefetch = 0
  • 使用TRANSACTED acknowledgement
  • 单线程消费者(concurrentConsumers = 1 / maxConcurrentConsumers = 1等)
  • 设置DispatchAsync = false