У меня есть приложение с основным потоком и потоком JMS, которые общаются друг с другом через ActiveMQ 5.15.11. Я могу отправлять сообщения просто отлично, однако я хотел бы, чтобы был способ вернуть статус или ошибки. Я заметил, что MessageListener
позволяет onSuccess()
и onException(ex)
как два события для прослушивания, однако я обнаружил, что вызывается только onSuccess()
.
Вот фрагменты моего кода.
JMS Тема:
ConnectionFactory factory = super.getConnectionFactory();
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(super.getQueue());
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(m -> {
try {
super.processRmbnConfigMsg(m);
} catch (JMSException | IOException e) {
LOG.error(e.getMessage(), e);
// I can only use RuntimeException.
// Also this exception is what I am expecting to get passed to the onException(..)
// call in the main thread.
throw new RuntimeException(e);
}
});
connection.start();
Основная тема (отправка сообщений в JMS):
sendMessage(xml, new AsyncCallback() {
@Override
public void onException(JMSException e) {
// I am expecting this to be that RuntimeException from the JMS thread.
LOG.error("Error", e);
doSomethingWithException(e);
}
@Override
public void onSuccess() {
LOG.info("Success");
}
});
Я ожидаю, что исключения, сгенерированные в new RuntimeException(e)
, будут каким-то образом обнаружены в приемнике событий onException(JMSException e)
, даже если RuntimeException
обернут.
Вместо этого я всегда получаю onSuccess()
событий. Я предполагаю, что событие onException(..)
происходит во время проблем со связью, но я хотел бы отправить обратно исключение вызывающей стороне.
Как мне выполнить sh задачу сбора ошибок в потоке JMS и отправки их обратно в мой вызывающий поток?