1

我想做这个:

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

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

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

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

有没有办法做到这一点?

4

3 回答 3

0

听起来您正在寻找的是低或零预取限制与客户端确认或个人确认的确认模式的组合。零预取将使您的客户端本质上是基于拉取的消费者,如果您的客户端在断开连接时无法确认已发送的消息,则将 ack 设置为客户端将导致代理重新传递消息。

于 2012-11-05T11:21:28.460 回答
0

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

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

警告不是有效的代码 (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>

另外我建议你使用 Camel来配置你的节流器

于 2012-11-05T16:46:48.400 回答
0

尝试以下...

  • 设置队列预取=0
  • 使用 TRANSACTED 确认
  • 单线程消费者(concurrentConsumers=1/maxConcurrentConsumers=1 等)
  • 设置 DispatchAsync = false
于 2012-11-06T05:33:03.353 回答