骆驼死信通道处理器
Camel Dead Letter Channel Processor
下面是我的骆驼路线代码
.errorHandler(deadLetterChannel("jmstx:queue:ErrorHandler")
.useOriginalMessage()
.maximumRedeliveries(1));
from("jmstx:queue:ErrorHandler")
.log("Sending Exception to MyErrorProcessor")
.bean(MyErrorProcessor.class);
from("file:/E:/Target/").routeId("Route1")
.setHeader("route1Header").constant("changed")
.log(LoggingLevel.DEBUG, "Route1Logger", "Inside Route 1")
.throwException(new MyException("E_MYERROR_01"))
.to("file:/E:/Target/Done");
下面是MyErrorProcessor
代码
public void process(Exchange exchange) throws Exception {
Exception e=(Exception)exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
e.printStackTrace();
if(e instanceof MyException){
MyCustomMessage myMsg=new MyCustomMessage(exchange);
logger.error(((MyException) e).getErrorCode(),((MyException) e).getErrorDesc());
}else{
MyCustomMessage myMsg=new MyCustomMessage(exchange); logger.error(myMsg.getFromRouteId(),e.getMessage());
}
}
我的记录器没有记录我作为 E_MYERROR_01
发送的错误代码
我在 errorHandler deadletterchannel 中做错了什么吗??
是,如果 jmstx
引用 JMS 端点,则它仅传输来自消息 body / header 的数据 - 不存储作为交换属性的异常。此外,传输的数据需要符合 JMS 规范,并且对您可以发送的内容有限制。在 Camel JMS 文档和来自 Oracle 的 JMS API javadoc 中阅读有关此内容。
如果您想将堆栈跟踪/异常发送到 jmstx
端点,您需要进行自定义消息转换并将信息添加到消息中的某处,该信息将作为 JMS 消息发送。也许作为 JMS header 或其他东西,然后存储为 String 文本。然后在处理器中你不能 de-serialize 作为 java 异常类型,但你拥有的数据就像字符串一样。
您也可以在发送到 JMS 之前使用处理器,这可能更容易。
errorHandler(deadLetterChannel("direct:dead")
.useOriginalMessage()
.maximumRedeliveries(1));
// route for dead letter where we log it before sending to JMS
from("direct:dead")
.log("Sending Exception to MyErrorProcessor")
.bean(MyErrorProcessor.class);
.to("jmstx:queue:ErrorHandler");
下面是我的骆驼路线代码
.errorHandler(deadLetterChannel("jmstx:queue:ErrorHandler")
.useOriginalMessage()
.maximumRedeliveries(1));
from("jmstx:queue:ErrorHandler")
.log("Sending Exception to MyErrorProcessor")
.bean(MyErrorProcessor.class);
from("file:/E:/Target/").routeId("Route1")
.setHeader("route1Header").constant("changed")
.log(LoggingLevel.DEBUG, "Route1Logger", "Inside Route 1")
.throwException(new MyException("E_MYERROR_01"))
.to("file:/E:/Target/Done");
下面是MyErrorProcessor
代码
public void process(Exchange exchange) throws Exception {
Exception e=(Exception)exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
e.printStackTrace();
if(e instanceof MyException){
MyCustomMessage myMsg=new MyCustomMessage(exchange);
logger.error(((MyException) e).getErrorCode(),((MyException) e).getErrorDesc());
}else{
MyCustomMessage myMsg=new MyCustomMessage(exchange); logger.error(myMsg.getFromRouteId(),e.getMessage());
}
}
我的记录器没有记录我作为 E_MYERROR_01
我在 errorHandler deadletterchannel 中做错了什么吗??
是,如果 jmstx
引用 JMS 端点,则它仅传输来自消息 body / header 的数据 - 不存储作为交换属性的异常。此外,传输的数据需要符合 JMS 规范,并且对您可以发送的内容有限制。在 Camel JMS 文档和来自 Oracle 的 JMS API javadoc 中阅读有关此内容。
如果您想将堆栈跟踪/异常发送到 jmstx
端点,您需要进行自定义消息转换并将信息添加到消息中的某处,该信息将作为 JMS 消息发送。也许作为 JMS header 或其他东西,然后存储为 String 文本。然后在处理器中你不能 de-serialize 作为 java 异常类型,但你拥有的数据就像字符串一样。
您也可以在发送到 JMS 之前使用处理器,这可能更容易。
errorHandler(deadLetterChannel("direct:dead")
.useOriginalMessage()
.maximumRedeliveries(1));
// route for dead letter where we log it before sending to JMS
from("direct:dead")
.log("Sending Exception to MyErrorProcessor")
.bean(MyErrorProcessor.class);
.to("jmstx:queue:ErrorHandler");