Jms 如何捕获ActiveMQAddressFullException?
使用带有嵌入式ActiveMQ Artemis的WildFly作为JMS实现。使用固定内存大小设置队列,如果队列已满,则执行Jms 如何捕获ActiveMQAddressFullException?,jms,wildfly,activemq-artemis,Jms,Wildfly,Activemq Artemis,使用带有嵌入式ActiveMQ Artemis的WildFly作为JMS实现。使用固定内存大小设置队列,如果队列已满,则执行FAIL操作。我需要能够捕获结果异常,以便客户端停止发送新消息。但是,调用send时似乎不会发生异常,但在事务结束时,会启动一些方法。我不确定如何正确处理此问题。如果您使用的是事务,那么在JMSMessageProducer上调用send时,消息实际上不会发送。它们仅在事务提交时发送消息。像这样将多个操作批处理在一起是事务的主要特性之一。如果在提交事务时发送消息时出现问题,
FAIL
操作。我需要能够捕获结果异常,以便客户端停止发送新消息。但是,调用send时似乎不会发生异常,但在事务结束时,会启动一些方法。我不确定如何正确处理此问题。如果您使用的是事务,那么在JMSMessageProducer
上调用send
时,消息实际上不会发送。它们仅在事务提交时发送消息。像这样将多个操作批处理在一起是事务的主要特性之一。如果在提交事务时发送消息时出现问题,则事务提交将失败,但“发送”消息的特定MessageProducer
将不知道该问题。您需要停止使用事务或以另一种方式通知发件人问题(该方式仅具有追溯效力)
如果您只是因为需要知道消息成功到达队列而使用事务,并且不需要将多个JMS操作分组到一个逻辑单元中,那么您可以停止使用事务,并且:
blockOnNonDurableSend=true
表示您正在发送非持久性(即非持久性)消息在任何情况下,无论是在调用
send
时实际发送消息,还是在稍后调用commit
时实际发送消息,如果在使用FAIL
后已达到max size bytes
,则不应实际发送消息。谢谢。我们确实需要继续使用事务,因为我们需要知道消息是否排队。鉴于此,您对我们如何实施某种流量控制有何建议。我们面临的问题是,当系统负载过重时,所有消息都被分页到磁盘,最终会填满整个磁盘。我们需要找到一种方法,在队列已经“满”的情况下,以编程方式不让更多的请求排队。不幸的是,这种用例在标准JMS API中似乎根本不受支持。我更新了我的答案以回应您的评论。希望有帮助!谢谢仍然需要对其进行消化,并了解如何在WildFly上下文和我们的应用程序中应用它。无论如何都将标记为正确。