是否有一种企业集成模式来组合2个队列中的项目?

问题描述

| 我有两个系统会生成需要使用的不同类型的消息,然后根据它们生成新消息。 第一个产生包含文件名的NEWFILE消息,该消息到达队列queue:file.new。 第二个生成包含文件名和TaskType的TASK消息,然后转到queue:task。 对于给定的文件名,只会有一个NEWFILE消息。 给定文件名将有多个TASK消息,每个消息具有不同的TaskType。 消息可以以任何顺序到达。 我需要转发每个出现在queue:perform上的TASK消息,但仅在匹配文件名的NEWFILE消息到达时才转发。 目前,我们在另一个(基于非队列的)系统中执行此匹配,该系统使用轮询来查找FILE和TASK,并维护两个表,一个用于FILES,一个用于TASKS,当其中一个出现时,我们检查是否存在匹配项,并且解雇相关任务。 我们正在寻求将其替换为一种消息传递解决方案,在该解决方案中,我们将保持尽可能少的状态并充分利用企业模式(Apache Camel)。 我不清楚哪种模式/组件可以满足我的要求。 谢谢汤姆     

解决方法

        看来您应该使用Aggregator模式。 您可以使用组件的各种选项来指示完成条件和消息之间的相关性 例如,以下要求表明您可能应该考虑“ 0”上的文件名:   只会有一条NEWFILE消息   对于给定的文件名,将有   给定多个任务消息   文件名 为了处理任务,您可以将任务消息临时存储到
newExchange
对象,然后在适当时可以将存储的消息刷新到其目标队列。我相信您在适当的时候有两个主要选择: 等待使用完成条件(例如大小,超时等)汇总给定上下文的所有消息(NEWFILE和TASK消息),为此您可以使用“ 2”选项来评估上下文是否已完成或不。完成后,将任务发送到以下队列。 等待直到NEWFILE消息到达,将临时存储的TASK消息刷新到目标队列,然后等待其余的TASK消息(再次,使用适当的条件指示消息上下文已结束)。 我没有在代码中尝试过,但是我相信虽然第一个选项可能会更容易,但是第二个选项可能会为您提供更好的性能,因为由于TASK消息会尽快转发到其目标队列,因此第一个任务很可能比后面的任务更早完成,而在第一种情况下,您必须等待所有任务产生,并且只有在此之后才能开始该过程。除此之外,由于您还应尽快刷新临时存储的消息,因此与第一个选项相比,您将获得较低的存储要求。这意味着,如果您要处理大消息和大容量消息,则需要较少的内存,如果不是这种情况,那么这两种解决方案可能是相似的。