基于实际路线的 Camel 选择

piztneat  于 2023-01-05  发布在  Apache
关注(0)|答案(1)|浏览(155)

我有两个独立的路由。两个路由基本上是相同的。不同的是源文件夹和目标文件夹。如果发生错误,两个路由都会抛出相同的异常。这是我在onException块中捕获的。在这里,我想根据实际的路由将文件写入一个文件夹。所以我想构建一个选择()....when(...)基于routeId。问题是,我怎样才能让routeId使用它来表示when。下面显示了一些代码,我认为它是如何工作的。但事实并非如此。也许有人有一个想法。

onException(SomeValidationException.class)
                        .handled(true)
                        .useOriginalMessage()
                        .choice()
                        .when(exchangeProperty("routeId").convertToString().isEqualTo("Route1"))
                        .to("file:data/error/Route1")
                        .when(exchangeProperty("routeId").convertToString().isEqualTo("Route2"))
                        .to("file:data/error/Route2")
                        .otherwise()
                        .log(LoggingLevel.ERROR, "I always get here")
                        .end();

                from("file:data/in/Route1")
                        .routeId("Route1")
                        .routePolicy(getRoutingPolicy())
                        .to("direct:RouteWhichWillThrowException")
                        .to("file:data/out/Route1");

                from("file:data/in/Route2")
                        .routeId("Route2")
                        .routePolicy(getRoutingPolicy())
                        .to("direct:RouteWhichWillThrowException")
                        .to("file:data/out/Route2");
r1wp621o

r1wp621o1#

我认为您的用例实际上最好使用一个路由错误处理程序,如下所示:

from("file:data/in/Route1").routeId("Route1")
    .onException(SomeValidationException.class)
        .handled(true)
        .useOriginalMessage()
        .to("file:data/error/Route1")
        .log(LoggingLevel.ERROR, "I always get here")
     .end()
    .routePolicy(getRoutingPolicy())
    .to("direct:RouteWhichWillThrowException")
    .to("file:data/out/Route1");

from("file:data/in/Route2").routeId("Route2")
    .onException(SomeValidationException.class)
        .handled(true)
        .useOriginalMessage()
        .to("file:data/error/Route2")
        .log(LoggingLevel.ERROR, "I always get here")
     .end()
     .routePolicy(getRoutingPolicy())
     .to("direct:RouteWhichWillThrowException")
     .to("file:data/out/Route2");

然而,虽然这在重用方面是可行的,但如果您的实现除了inputURI、outputURI和errorURI之外总是相同的话,那就太糟糕了。我建议创建一个模板路由,然后创建它的新示例。

class MyCustomRouteBuilder extends RouteBuilder {
    private String myRouteId;
    private String inputURI;
    private String outputURI;

    @Override
    public void configure() {
        from(inputURI).routeId(myRouteId)
            .onException(SomeValidationException.class)
                .handled(true)
                .useOriginalMessage()
                .to(errorURI)
                .log(LoggingLevel.ERROR, "I always get here")
             .end()
             .routePolicy(getRoutingPolicy())
             .to("direct:RouteWhichWillThrowException")
             .to(outputURI);
    }
}

//different route builder configure
MyCustomRouteBuilder route1 = new MyCustomRouteBuilder();
route1.setRouteId("");
route1.setInputURI("");
route1.setOutputURI("");
route1.setErrorURI("");
context.addRoutes(route1);

相关问题