骆驼死信通道处理器



下面是我的骆驼路线代码

.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

我在错误处理程序死信通道中有什么错误吗?

是的,

如果jmstx引用 JMS 端点,那么它只传输来自消息正文/标头的数据 - 而不是存储为 Exchange 属性的异常。此外,传输的数据需要根据 JMS 规范合规,这限制了您可以发送的内容。在 Camel JMS 文档和 Oracle 的 JMS API javadoc 中阅读有关此内容的信息。

  • http://camel.apache.org/jms

如果要将堆栈跟踪/异常发送到jmstx终端节点,则需要执行自定义消息转换,并在消息中的某个位置添加信息,该消息将作为 JMS 消息发送。也许作为JMS标头或其他东西,然后存储为字符串文本。然后在处理器中,您不能将其反序列化为 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");

相关内容

  • 没有找到相关文章

最新更新