当前位置: 首页 > 知识库问答 >
问题:

路线级别未捕获骆驼的receipientList EIP异常

方野
2023-03-14

Camel Version 2.22.0
运行时:SpringBoot:2.0.2.RELEASE
JDK版本:1.8。0_121

弹性公网IP:收件人列表。

问题:从接收方列表的并行进程引发的异常未在路由级别的onExc的子句中捕获。

下面是DSL

@Override
public void configure() throws Exception {

    restConfiguration().clientRequestValidation(true)
     //.contextPath("/pss/v1.0/")
     .port("8080").host("0.0.0.0")
     .enableCORS(true)
     .apiContextPath("/api-doc")
     .apiProperty("api.title", "Test REST API")
     .apiProperty("api.version", "v1")
     .apiContextRouteId("doc-api")
     .component("servlet")
     .bindingMode(RestBindingMode.json);
    
    rest("/api/").clientRequestValidation(true)
     .id("api-route")
     .consumes("application/json")
     .get("/bean/{name}")
     .bindingMode(RestBindingMode.json)
     .to("direct:remoteService");
    
    from("direct:remoteService")
     .onException(Exception.class).handled(true)
     .log("Exception Caught : ${exception.message}")
     .end()
     .recipientList(constant("direct:route1, direct:route2"), ",").parallelProcessing().aggregationStrategy(new GroupedBodyAggregationStrategy())
     .stopOnException()
     .end()
     .log("The final Exchange data : ${exception.message}");
    
    from("direct:route1")
     .setHeader( Exchange.CONTENT_ENCODING, simple("gzip"))
     .setBody(simple("RESPONSE - [ {  \"id\" : \"bf383eotal length is 16250]]"))
     .log("${body}");
    
    from("direct:route2")
     .log("${body}")
     .process(e-> {
        List<String> myList = new ArrayList();
        
        myList.add("A");
        myList.add("b");
        myList.add("C");
        
        e.getIn().setBody(myList);
     })
     .split(body())
     .parallelProcessing(true)
     .aggregationStrategy(new GroupedBodyAggregationStrategy())
     .stopOnException()
     .log("${body}")
     .choice()
     .when(simple("${body} == 'b'"))
     .throwException(new Exception("jsdhfjkASDf"));
}

共有2个答案

桂杰
2023-03-14

这是一个典型的错误:(就像拆分的EIP一样)每个接收者都会处理原始Exchange的副本。这些副本上的任何故障都不会影响(引发异常)处理主Exchange的路由,因为每个交换机都在一个完全独立的工作单元中运行。如果启用“shareUnitOfWork”选项(在接收方列表上),则应传播异常。

梁丘钊
2023-03-14

尝试将onExc的设置为全局的,如下所示:

onException(Exception.class).handled(true)
.log("Exception Caught : ${exception.message}")
.end();

    from("direct:remoteService")
.recipientList(constant("direct:route1, direct:route2"), ",").parallelProcessing().aggregationStrategy(new GroupedBodyAggregationStrategy())
.stopOnException()
.end()
.log("The final Exchange data : ${exception.message}")
;

UPD:所以您需要禁用接收者路由中的错误处理程序。像这样尝试(无法正常插入代码示例)

 类似资料:
  • 我是Stack Overflow和Apache Camel路由的新手,遇到了一些麻烦。我创建了一个非常简单的SOAP Web服务,它接受一个包含一些随机文本的XML请求,然后在响应中返回相同的字符串。 使用Camel,我能够将请求发送到web服务并获得响应(如果我使用日志组件捕获请求/响应)。 理想情况下,我希望将XML消息(message1.XML、message2.XML、message3.X

  • 我有一个spring boot应用程序,我正在向其中添加一个camel路由。定义路由的类扩展了FatJarRouter,并用@component注释。当应用程序作为spring boot应用程序运行时,不会识别路由。但是,如果我在主类中使用@SpringBootApplication注释编写路由,则会标识路由。这是它目前在日志中的显示方式: 请告诉我如何在将路由作为一个单独的类而不是在主类中编写时

  • 我通过以下代码以编程方式创建JMS路由: 我有课: 我想在上述路由和endpoint之间交换一些信息/参数。根据我想要的参数值,选择要在这个消息侦听器容器中设置的连接工厂。 请让我知道我是否能够解释我的问题陈述。 还有其他方法可以实现这一点吗?我想在运行时构建连接工厂,路由也是如此。JmsEndpoint 中是否有任何方法可以用来了解路由 id?

  • 问题内容: 我一直在仔细研究Apache Camel文档,试图对它的两个 最基本 概念(端点和路由)有一个具体的了解,尽管这些术语在文档中各处都使用,但是我找不到真正定义它们的参考。是以及它们的用途。尽管它们的名称听起来很明显,而且我 想 我理解它们的含义,但是现在我已被分配到一项使我深深陷入Apache Camel Land的任务,而了解这些机制的绝对至关重要是。 我的猜测是,“端点”只是一个b

  • 问题内容: 我尝试对Apache骆驼路线进行junit测试。像这样的东西: 构建器类的定义如下 “ myExportRouteProcessor”类仅从JPA存储库中获取一些数据,并将结果放入路由。我想要的是在测试类中触发此路由,以检查整个过程是否正确完成。当前,处理器未启动。我该怎么办? 问题答案: 您可以使用AdviceWithRouteBuilder#replaceFromWith直接替换测

  • 我试着为阿帕奇骆驼路线做一个jUnit测试。类似于这样: builder类的定义如下 myExportRouteProcencer类只是从JPA存储库中获取一些数据,并将结果放入路由。我想要的是在测试类中触发此路由,以检查整个过程是否正确完成。目前,处理器没有被触发。我应该做些什么?