Apache camel 如何在骆驼路线结束前关闭Beanstalkd邮件

Apache camel 如何在骆驼路线结束前关闭Beanstalkd邮件,apache-camel,beanstalkd,Apache Camel,Beanstalkd,我有一个beanstalkd队列,并通过一个子队列启用了作业相关性,该子队列在相关作业完成时发布,在本例中,我有分布式并行处理,以便在所有作业完成后触发操作 问题是,我在响应队列中循环拾取消息,但一旦完成,它在结束之前不会尝试删除任何消息,导致它多次尝试关闭同一消息。为此,我试图用并行处理器的响应来丰富原始消息,是否有任何方法可以在direct完成后结束消息,或者通过另一种消息聚合方法 @Bean RouteBuilder示例Route(){ 返回新的RouteBuilder(){ @凌驾 pu

我有一个beanstalkd队列,并通过一个子队列启用了作业相关性,该子队列在相关作业完成时发布,在本例中,我有分布式并行处理,以便在所有作业完成后触发操作

问题是,我在响应队列中循环拾取消息,但一旦完成,它在结束之前不会尝试删除任何消息,导致它多次尝试关闭同一消息。为此,我试图用并行处理器的响应来丰富原始消息,是否有任何方法可以在direct完成后结束消息,或者通过另一种消息聚合方法

@Bean
RouteBuilder示例Route(){
返回新的RouteBuilder(){
@凌驾
public void configure()引发异常{
/**
*步骤1:从侦听器管道读取消息,其形式如下:
* {
*父作业id:父作业id
*拆分计数:预期的响应数
* }
**/
从(”beanstalk://localhost/dev_job_listener?onFailure=release&jobDelay=20&jobTimeToRun=10")
.unmarshal().json(JsonLibrary.Jackson,Map.class)
.setProperty(“消息”,简单(${body}”))
//获取所需的管道作业ID,以允许删除此管线末端的作业
.进程(新处理器(){
@凌驾
公共作废进程(Exchange)引发异常{
最终的Deque堆栈=新的ArrayDeque();
stack.push(Long.valueOf(exchange.getIn().getHeader(“beanstalk.jobId”).toString());
setProperty(“stack”,stack);
Map message=(HashMap)exchange.getProperties().get(“message”);
setProperty(“parent_job_id”,Integer.valueOf(message.get(“parent_job_id”).toString());
setProperty(“message_count”,Integer.valueOf(message.get(“split_count”).toString());
}
})
/**
*步骤2:在响应队列作业{parent_job_id}中列出完成消息的数量
*从分割计数。
*/
.to(“direct:verifysubjects”).end()
/**
*步骤3:将所有作业都已完成的信息发布到完整队列
*/
.至(”beanstalk://localhost/next_step?jobTimeToRun=10")
.进程(新处理器(){
@凌驾
公共作废进程(Exchange)引发异常{
setHeader(“beanstalk.jobId”,exchange.getProperty(“stack”,Deque.class).pop());
}
})
.log(“结束作业:+简单(${header.beanstalk.jobId}”);
来自(“直接:验证主题”)
.log(“->direct:verifysubbobs”)
.setProperty(“url”),简单(“beanstalk://localhost/dev_job_“+简单(${property.parent\u job\u id}”).getText()+”?onFailure=release&jobTimeToRun=10”))
.pollEnrich().simple(${property.url})
.进程(新处理器(){
@凌驾
公共作废进程(Exchange)引发异常{
Deque stack=exchange.getProperty(“stack”,Deque.class);
stack.push(Long.valueOf(exchange.getIn().getHeader(“beanstalk.jobId”).toString());
整数计数器=exchange.getProperty(“message_count”,Integer.class);
设置属性(“消息计数”,计数器);
}
})(完)
.choice().when(简单(“${property.message\u count}>0”))
.至(“直接:验证主体”)
(完)
.进程(新处理器(){
@凌驾
公共作废进程(Exchange)引发异常{
setHeader(“beanstalk.jobId”,exchange.getProperty(“stack”,Deque.class).pop());
}
})(完)
.log(“