error-handling - Camel 死信 channel 处理器

标签 error-handling apache-camel dead-letter

下面是我的 Camel 路线代码

.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端点,那么它只传输消息正文/ header 中的数据 - 不传输存储为交换属性的异常。此外,传输的数据需要符合 JMS 规范,这对您可以发送的数据有限制。请参阅 Camel JMS 文档和 Oracle 的 JMS API javadoc 了解这一点。

如果您想将堆栈跟踪/异常发送到 jmstx 端点,您需要执行自定义消息转换,并将信息添加到作为 JMS 消息发送的消息中的某处。也许作为 JMS header 或其他内容,然后存储为字符串文本。然后在处理器中,您无法将其反序列化为 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");

关于error-handling - Camel 死信 channel 处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29787625/

相关文章:

android - OpenGL ES 字符串错误

node.js - 在Node.js上响应客户端的正确方法?

cxf - 蓝图、Apache Camel 和 cxfrs

java - 为什么在将持久 activemq 消息更改为非持久消息时无法获得性能提升?

azure - 架构问题-Azure服务总线和消息顺序保证

architecture - RabbitMQ中需要单独的死信交换吗?

ruby-on-rails - Rails Controller - 处理 404 并以动态 HTML 错误页面响应,无论请求格式如何

apache-camel - 如何为不同的外部服务/应用程序设计/开发集成层或总线

java - 从一个队列铲到另一个队列后如何拒绝消息?

r - 在lapply中使用tryCatch重试列表的元素