如何解决如何捕获 ActiveMQAddressFullException?
使用带有嵌入式 ActiveMQ Artemis 的 WildFly 作为 JMS 实现。如果队列已满,队列设置有固定的内存大小和 FAIL
操作。我需要能够捕获产生的异常,以便客户端停止发送新消息。但是,在调用 send 时似乎没有发生异常,而是在事务结束时将几个方法向上。我不知道如何正确处理这个问题。
解决方法
如果您使用的是事务,那么当您在 JMS send
上调用 MessageProducer
时,不会实际发送消息。它们的消息仅在事务提交时发送。像这样将多个操作批处理在一起是事务的主要特征之一。如果在提交事务时发送消息出现问题,则事务提交将失败,但“发送”消息的特定 MessageProducer
将不知道它。您需要停止使用交易或以其他方式将问题告知发件人(这只会具有追溯力)。
如果您仅使用事务,因为您需要知道消息成功到达队列,并且不需要将多个 JMS 操作组合到一个逻辑单元中,那么您可以停止使用事务,并且:
- 确保您发送的是持久(即持久)消息。
- 在您的客户端 URL 中设置
blockOnNonDurableSend=true
表示您要发送非持久(即非持久)消息。
在任何一种情况下,客户端都将等待来自代理的响应,即消息已成功接收。您可以在 the ActiveMQ Artemis documentation 中阅读更多相关信息。
如果您的客户端等待响应超时,那么这可能意味着代理没有收到消息,您可以再次发送它。但是,在某些情况下,代理(或网络)可能会在成功接收消息之后但在响应到达客户端之前失败。在这些情况下,如果客户端再次发送消息,则可能会导致重复。为了降低重复的风险,您可以在消息上设置重复 ID 并在代理上使用重复检测。您可以在 the ActiveMQ Artemis documentation 中阅读有关重复检测的更多信息。
在任何情况下,无论消息是在调用 send
时实际发送还是稍后在调用 commit
时,如果 {{1}自从您使用 max-size-bytes
以来已达到 }。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。