Apache Camel 3.14.9:使用 CLIENT_ACKNOWLEDGE 模式在处理器内部进行异常处理

问题描述 投票:0回答:1

如何配置具有以下要求的路由器:我正在使用 Java DSL

  1. 我有一个带有 Agregator->Splitter->Resequencer EIP 的路由器,现在,当重新排序器将交换一一批量发送到处理器时,在交换出现异常后,我必须将其余消息发送到不同的队列。可以吗?

任何示例代码块都会在这里提供很大的帮助。 我正在使用 Springboot 和 Apache Camel

exception apache-camel jms
1个回答
0
投票

如果我很好地理解您的要求,您希望您的

resequencer
将交换定向到某个
Processor
,但如果发生异常,您希望将消息传递到不同的端点。

如果不确切知道您的需求是什么,就很难给您提供代码示例。例如。

rest of the messages
的定义是什么?您指的是整批还是只是聚合批次?

无论如何,解决这个问题的方法是相同的,但根据您的具体需求会有不同的风格。您可以实现一个单例来存储要走的路径,通常是

direct:default
,但是当发生不好的事情时,将路径切换到
direct:error
。在
resequencer
的出口处,您有一个处理器,它将根据单例中存储的当前路径路由消息。枚举是一种很好的单例实现,因此这是一种方法:

public Enum Destination {
    PATH;

    @Getter
    private String value = "direct:default";

    public void switchToError() {
       value = "direct:error"; 
    }
    
    public void switchToDefault() {
        value = "direct:default";
    }
}

所以,在你的主要路线中你将会有这样的东西:

resequence(body()).batch()
.process(exchange -> exchange.getIn().setHeader("next", Destination.PATH.getValue()))
.routingSlip(header("next"));

并且您在错误处理部分中将路径设置为

direct:error

onException(Exception.class)
.process(exchange -> Destination.PATH.switchToError())
.handled(true)
.to("direct:error");

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.