限制批量发送持久性消息的ActiveMQ生产者的正确方法是什么?

时间:2015-08-14 03:20:58

标签: java jms activemq

我有一个生产者,它将批次中的持久性消息发送到利用JMS事务的队列。

我已经测试过并发现在使用批量大小为1时应用生产者流控制。我可以看到我的生产者根据我为队列配置的内存限制进行了限制。这是我的Producer Flow Control配置:

<policyEntry queue="foo" optimizedDispatch="true"
     producerFlowControl="true" memoryLimit="1mb">
</policyEntry>

队列中的待处理消息数量处于控制状态,我将其视为生产者流程控制的证据。

但是,当批量大小增加到2时,我发现这个内存限制没有得到遵守,而且生产者根本没有被调整。证据是队列中待处理消息的数量继续增加,直到达到配置的 storeUsage 限制。

我理解这可能是因为当批量大小超过1时,即使我没有明确地将 useAsyncSend 设置为 true ,也会以异步方式发送消息。

ActiveMQ的Producer Flow Control documentation提到要限制异步发布者,我们需要在生产者中配置生产者窗口大小,这将迫使生产者在达到窗口限制时等待确认。< / p>

但是,当我在生产者中配置生产者窗口大小并尝试批量发送消息时,会抛出异常并且没有发送消息。

这让我思考并问这个问题,“是否可以在批次中发送持久性消息时配置生产者窗口大小?”。

如果没有,那么在批次中限制发送持久性消息的生产者的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

没有办法节制“每秒最大消息数”或类似情况。你要做的是启用生产者流控制和vm游标,然后将该队列(或者如果你愿意的话,可能是所有队列)的内存限制设置为某个合理的级别。

如果已达到队列内存限制,您可以在配置中决定生产者是应该挂起还是抛出异常。

<policyEntry queue="MY.BATCH.QUEUE" memoryLimit="100mb" producerFlowControl="true">
  <pendingQueuePolicy>
    <vmQueueCursor/>
  </pendingQueuePolicy>
</policyEntry>