28.5.6. 使用 JMS 作为死信队列存储交换
通常,当使用 JMS 作为传输时,它只会将正文和标头作为载荷传输。如果要将 JMS 与 Dead Letter Channel 搭配使用,请将 JMS 队列用作 Dead Letter Queue,则通常导致的 Exception 不会存储在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange 选项指示 Camel 将整个 Exchange 存储在队列中,作为包含 org.apache.camel.support.DefaultExchangeHolder 的 javax.jms.ObjectMessage。这可让您从死信队列使用,并在 Exchange.EXCEPTION_CAUGHT 的 Exchange 属性中检索原因例外。以下演示演示了这一点:
// setup error handler to use JMS as queue and store the entire Exchange
errorHandler(deadLetterChannel("jms:queue:dead?transferExchange=true"));
然后,您可以使用 JMS 队列并分析问题:
from("jms:queue:dead").to("bean:myErrorAnalyzer");
// and in our bean
String body = exchange.getIn().getBody();
Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
// the cause message is
String problem = cause.getMessage();