如何捕获 ActiveMQAddressFullException?

How to catch ActiveMQAddressFullException?

使用带有嵌入式 ActiveMQ Artemis 的 WildFly 作为 JMS 实现。队列设置有固定的内存大小,如果队列已满则执行 FAIL 操作。我需要能够捕获由此产生的异常,以便客户端停止发送新消息。但是调用send的时候好像没有出现异常,而是在事务结束的几个方法up。我不确定如何正确处理它。

如果您正在使用事务,那么当您在 JMS MessageProducer 上调用 send 时,消息 而不是 实际发送。它们的消息仅在提交事务时发送。像这样将多个操作一起批处理是事务的主要特征之一。如果在提交事务时发送消息有问题,那么事务提交将失败,但是“发送”消息的特定 MessageProducer 将不知道。您需要停止使用交易或以其他方式将问题通知发件人(这只会追溯)。

如果您使用事务,因为您需要知道消息已成功到达队列并且您不需要将多个 JMS 操作组合到一个逻辑单元中,那么您可以停止使用交易和:

  1. 确保您发送的是持久的(即持久的)消息。
  2. 在您的客户端中设置 blockOnNonDurableSend=true URL 是否发送非持久(即非持久)消息。

在任何一种情况下,客户端都将等待消息已成功收到的代理的响应。您可以在 the ActiveMQ Artemis documentation.

中阅读更多相关信息

如果您的客户端在等待响应时超时,则可能意味着代理没有收到消息,您可以重新发送。但是,在某些情况下,代理(或网络)可能会在 after 成功接收消息但 before 响应可以到达客户端时失败。在这些情况下,如果客户端再次发送消息,可能会导致重复。为了降低重复的风险,您可以在消息上设置重复 ID 并在代理上使用重复检测。您可以在 the ActiveMQ Artemis documentation.

中阅读有关重复检测的更多信息

在任何情况下,无论消息是在调用 send 时实际发送还是稍后在调用 commit 时发送,消息都应该 而不是 实际发送如果自从您使用 FAIL.

后已达到 max-size-bytes