ActiveMQ Artemis禁用队列:生产者发消息无报错,如何触发错误反馈?
让ActiveMQ Artemis对禁用队列的生产请求返回错误
1. 生产者端配置(Java/.NET)
无论是Java JMS客户端还是.NET客户端,都可以通过设置**failIfNoRoute**参数为true,让生产者在消息无法路由到目标队列(包括队列被禁用的场景)时收到明确错误。
Java客户端示例
创建MessageProducer时指定该属性:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = session.createQueue("myQueue"); MessageProducer producer = session.createProducer(queue); // 开启路由失败时的错误反馈 producer.setFailIfNoRoute(true); // 队列禁用时,发送消息会抛出InvalidDestinationException try { producer.send(session.createTextMessage("test")); } catch (InvalidDestinationException e) { System.err.println("队列已禁用,无法发送消息: " + e.getMessage()); }
.NET客户端示例
以NMS客户端为例,在创建生产者时设置对应参数:
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); IQueue queue = session.GetQueue("myQueue"); IMessageProducer producer = session.CreateProducer(queue); // 开启路由失败时的错误反馈 producer.FailIfNoRoute = true; try { producer.Send(session.CreateTextMessage("test")); } catch (InvalidDestinationException e) { Console.WriteLine("队列已禁用,无法发送消息: " + e.Message); }
2. Broker端全局/地址级配置
如果希望所有生产者发送到禁用队列时都收到错误,无需逐个修改生产者代码,可以在Broker的broker.xml中配置地址的**send-reject-on-destination-disabled**属性为true。
全局默认配置
修改默认地址设置,对所有队列生效:
<address-settings> <address-setting match="#"> <!-- 目标队列/地址禁用时,拒绝发送请求并返回错误 --> <send-reject-on-destination-disabled>true</send-reject-on-destination-disabled> </address-setting> </address-settings>
特定地址配置
仅针对指定队列/地址生效:
<address-settings> <address-setting match="myQueue"> <send-reject-on-destination-disabled>true</send-reject-on-destination-disabled> </address-setting> </address-settings>
配置后,生产者发送消息到禁用队列时,Broker会直接返回错误,客户端会收到对应异常(如Java的InvalidDestinationException、.NET的InvalidDestinationException)。
3. 消费者端的状态感知
队列被禁用后,已创建的消费者会自动断开连接;新消费者尝试连接时,会直接收到InvalidDestinationException(Java)或对应.NET异常,无需额外配置即可感知队列状态。
内容的提问来源于stack exchange,提问作者Priyabrat
相关产品推荐
相关产品推荐

