在 Apache camel 和 Spring boot 中拆分正文

Split The body in Apache camel and Spring boot

提问人:Sayed Sajad Hosseini 提问时间:11/15/2023 更新时间:11/15/2023 访问量:63

问:

我有一个这样的过程,可以按正文将一些查询发送到下一个过程:

.process(exchange -> {
   List<GlossaryDTOResponse[]> glossaries = exchange.getIn().getBody(List.class);
   
   List<String> queries = new ArrayList<>();

   queries.add("countries=AF&planttypes=AA&status=DD&language=en-EN&pagesize=1");
   queries.add("countries=BF&planttypes=AA&status=DB&language=en-EN&pagesize=1");
   
   List<ActivityIssuesDTO> responses = new ArrayList<>();

   // just to send an empity response array to create the final result
   Util.setProperty(exchange, "response", responses);

   exchange.getIn().setBody(queries);
})

然后我拆分正文以读取每个正文元素:

.split(body())

然后我读取每个元素中的正文,并通过 HTTP 查询将其发送到微服务:

.process(exchange -> {
   List<GlossaryDTOResponse>  glossaryDTOResponses = exchange.getIn().getBody(List.class);
   List<ActivityIssuesDTO> responses = exchange.getProperty("response", List.class);

   Util.setProperty(exchange, "response", responses);
   exchange.getIn().setHeader(Exchange.HTTP_QUERY, glossaryDTOResponses.get(0));
})
.toD(serviceUtils.getActivityEndpoint() + ServiceUtils.ACTIVITIES + Util.BRIDGE_ENDPOINT)
.unmarshal().json(ActivityIssuesDTO.class)

在这个过程中,我在 activityIssuesDTO 中得到了我的最终响应,我将其与正文一起发送。

.process(exchange -> {
   ActivityIssuesDTO activityIssuesDTO = exchange.getIn().getBody(ActivityIssuesDTO.class);     
   List<ActivityIssuesDTO> activityIssuesDTOs = exchange.getProperty("response", List.class);
   activityIssuesDTOs.add(activityIssuesDTO);
                
   exchange.getIn().setBody(activityIssuesDTOs);
})
.marshal().json();

问题是我看不到我的响应,也无法编组它。

谢谢。

我删除了拆分,对于一个项目(查询),没关系,我可以看到我的回复,但对于许多查询,我看不到我的回复。

我也尝试过静态数组,它是一样的。

java spring-boot 拆分 apache-camel

评论


答:

0赞 Sayed Sajad Hosseini 11/15/2023 #1

正如我所理解的那样,在每个 Split 中,我们还需要一个聚合器来聚合我们的消息以继续该过程,我通过创建一个聚合器并将创建最终结果放在我的聚合器中来解决它,这个结果来自我的微服务。

这是最终结果:


.split(body()) 
   .aggregationStrategy(new ActivityAggregator())
   .streaming()
   .to(direct(GET_QUERY_FINAL))
   .end()

这是我的内部路线:


from(direct(GET_QUERY_FINAL))
   .log("getting the query and send to activity ms")
   .process(exchange -> {
      String queries = exchange.getIn().getBody(String.class);
      List<ActivityIssuesDTO> response = exchange.getProperty("response", List.class);
      Util.setProperty(exchange, "response", response);
      exchange.getIn().setHeader(Exchange.HTTP_QUERY, queries);
     })
.toD(serviceUtils.getActivityEndpoint() + ServiceUtils.ACTIVITIES + Util.BRIDGE_ENDPOINT)
.unmarshal().json(ActivityIssuesDTO.class);

在我的聚合器中,我只是将最终结果放在我的新数组中。

谢谢。