我有两个系统可以生成我需要使用的不同类型的消息,然后根据它们生成新消息。
第二个产生包含文件名和任务类型的TASK消息,然后转到 queue:task 。
对于给定的文件名,只会有一个 NEWFILE消息。
当匹配文件名的NEWFILE消息到达时,我需要将每个TASK消息转发到 队列:执行 但仅
目前我们在另一个(非基于队列的)系统中进行匹配,使用轮询查找FILE和TASK并维护两个表,一个用于FILES,另一个用于TASKS,当任一个出现时,我们检查匹配的内容有相关任务有火。
我们希望用消息传递解决方案替换它,在这种解决方案中我们保持尽可能少的状态,并尽可能多地使用企业模式(Apache Camel)。
我不清楚哪种模式/组件能满足我的要求。
谢谢,汤姆
答案 0 :(得分:0)
您似乎应该使用Aggregator模式。 您可以使用组件的各种选项来指示完成标准和消息之间的相关性
例如,以下要求表明您可能应该考虑correlationExpression
上的文件名:
只会有一条NEWFILE消息 对于给定的文件名将有 给定的多个TASK消息 文件名
为了处理任务,您可以暂时将任务消息存储到
newExchange
对象,然后当适当时,您可以将存储的消息刷新到其目标队列。我相信适当的时刻有两个主要选项:
等待所有使用完成条件(例如大小,超时等)聚合给定上下文的消息(NEWFILE和TASK消息),例如您可以使用的completionPredicate
选项以评估上下文是否已完成。完成后,将任务发送到以下队列。
等到NEWFILE消息到达,将临时存储的TASK消息刷新到目标队列,然后等待剩余的TASK消息(再次,使用适当的标准指示消息上下文已经结束)。
我没有在代码中尝试过,但我相信虽然第一个选项可能更容易,但第二个选项可能会提供更好的性能,因为TASK消息会尽快转发到目标队列,第一个任务可能比后者更早完成,而在第一个案例中你必须等待生成所有任务,然后才开始执行。除此之外,由于您还要尽快刷新临时存储的消息,因此与第一个选项相比,您的存储要求也会降低。这意味着如果你正在处理大型消息和大量的内存,你将需要更少的内存,如果情况并非如此......那么两种解决方案可能都是相似的。