我正在尝试使用RabbitMQ-JMS客户端,故意创建一个长的onMessage()侦听器来查看客户端将如何恢复。
Context context = new InitialContext();
rabbitMQ = (RMQConnectionFactory)context.lookup("java:global/jms/ConnectionFactory");
queue = (Queue)context.lookup("java:global/mq/kodo");
connection = rabbitMQ.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
Thread.sleep(20000);
}
});
我看到DeliveryExecutor类在处理消息时有超时,并且在其异常处理程序中,它所做的一件事就是关闭通道,从而放弃了我的消费者。
基于RabbitMQ docs,客户端应该自动恢复,但我猜这些情况的处理方式不同。更糟糕的是,RabbitMQ-JMS客户端似乎是故意设计的,以防止我指定自己的ExceptionHandler来避免这种行为。
有没有其他方法可以通过JMS API处理这种异常处理? (我尝试在jms.Connection上添加了一个ExceptionListener,但它永远不会被调用)。
我被困了吗?我怎么能发现我的消费者死了并试图重新连接?如何确保我的听众有某种形式的自动恢复?