3

我在使用 Camel 时遇到问题,当调用在交换机上设置故障的处理器时,路由在完成路由之前中止。我有一个这样配置的异常处理程序:

onException(Throwable.class) {
  process(new Processor() {
    public void process(Exchange exchange) {
      // do some logging of exception details
    })
    .handled(true)
    .process(new ExceptionProcessor())
    .bean(new QueueBean(), "writeRequest")
    .bean(new QueueBean(), "writeResponse)
    .end();
  });
}

在 ExceptionProcessor 类中,它看起来像:

public void process(Exchange exchange) {
  Exception ex = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
  if(ex instanceof MyException) {
    // do some stuff
    exchange.setProperty("errorTransaction", errorMsg);
    exchange.getIn().setBody(response);
    exchange.getIn().setFault(true);
  } else if(ex instanceof SomeOtherException {
    // do some other stuff
    exchange.getIn().setFault(true);
  }
}

问题是,如果捕获到异常,则不会调用 QueueBean 行。创建并发送了一个 SOAP 错误,但不会调用进程 (new ExceptionProcessor) 之后的任何内容。我承认我不是骆驼专家,所以我的设置方式可能有问题。

有趣的是,这曾经奏效。我们更新了 Camel 和 Spring 的版本以在 JDK 8+ 下工作,并且行为从 Camel 2.13 更改为 Camel 2.20

现在,如果我在异常处理器中注释掉 setFault(true) 行,它会正确调用路由中的以下行。这是有道理的,因为我实际上并没有告诉 Camel 创建一个 SOAP 错误——事实上,我正在生成一个自定义 SOAP 消息来发送回来,而不是 Camel 生成的 SOAP 错误。但是,就像我说的那样,以前这无需注释掉 setFault(true) 行就可以工作。

此外,我在异常处理器中还有其他异常,我检查这些异常确实会发回 SOAP 错误,因此(我相信)在交换中正确调用 setFault(true)。这些也无法继续路由,并且永远不会创建/调用 QueueBean。

4

0 回答 0