2014-01-30 14 views
2

对于Spring TaskExecutor抽象,是否有任何等效的ActiveMQ message groups?这个想法是,当从消息队列(使用消息组的ActiveMQ)消费消息时,消息处理任务的执行将按顺序执行(处理来自消息组的消息的任务在先前处理来自该组的消息的任务尚未完成)。在Spring TaskExecutor中等效的ActiveMQ消息组

一个选项是抛弃TaskExecutor(在我的情况下是一个ThreadPoolTask​​Executor)并使用固定数量的工作线程,每个工作线程都直接从MQ中消耗,但是失去了ThreadPoolTask​​Executor提供的执行灵活性,毫不犹豫地这样做。

乍一看,在Spring中似乎没有这样的功能,但是我拒绝相信我是第一个遇到过这种问题的人,而且这个问题以前还没有解决。任何见解欢迎:)

+0

Spring集成具有[聚合](http://docs.spring.io/spring-integration/docs/2.0.0.RC1/reference/html/aggregator.html),其聚合相关的消息。我知道,与任务不太一样。 – flup

+0

其实我并不需要聚合,只是订购......各种各样的.. :) – Manjabes

回答

1

简单的答案 - 没有没有。 TaskExecutor只是线程池的一个抽象,所以没有任何线程间路由的知识。根据你想要控制的事情,你有没有看过编写一个简单的路线Camel来控制消息路由到你的线程?

+0

乍一看,骆驼的选择似乎至少为“硬线”作为我目前的“解决方案” ...... – Manjabes

1

我不知道任何类似于ActiveMq可以使用弹簧任务执行器

您的要求

“的想法是,从消息队列消费消息时(一个 ActiveMQ的利用消息组),然后将执行的消息 处理任务的执行(在处理来自该组的消息的前一个任务 还没有完成之前,处理来自消息组的消息的任务 没有开始)。“

我的建议:

您指定的要求,可以不必在简单的Java任何麻烦来执行。

您可以在数据库中使用一个简单的表创建一个虚拟队列,并使用自定义查询生成在你需要的方式的内容。

当数据存在于数据库中时,您可以执行所有操作,例如获取类似数据,重用数据等。一旦实现了这些简单步骤,您可以在没有太多开销的情况下完成使用ActiveMQ执行的所有操作。

  1. 将每个请求插入到数据库中。
  2. 根据需求获取数据。
  3. 根据您获取的数据构建您需要的内容。
  4. 使用任务计划程序执行您需要执行的操作。
  5. 从数据库中删除数据。

我没有看到任何使用一些自定义代码的要求麻烦。

希望它有帮助。好运:)

解决方案,不使用数据库。

1创建你所需要的元素的类文件。如ID,名称,地址等。

2创建一个静态的最终的HashMap像这样用key作为分组值和arraylistclassName作为值。

public static final HashMap<Key, List<ClassName>> map= new HashMap<Key, List<ClassName>>(); 

3,如果存在该键的条目类现在添加到列表中HashMap。否则用这个新密钥和一个带有该类的ArrayList放置一个新的散列值。现在

if(map.containsKey(className.getId())){ 
      map.get(className.getId()).add(className); 
     } 
     else{ 
      List<ClassName> lstClass= new ArrayList<ClassName>(); 
      lstClass.add(className); 
      map.put(className.getId(), lstClass); 
     } 

4为每个键你会得到包含所有关键

类这样会起作用,就像DB类ClassNameArrayList。在这个例子中,你无法基于多个值进行条件判断。但根据您的要求,任何事情都可以改变。

+0

另一个数据库的依赖是什么我怕我买不起。 – Manjabes

+0

同样的事情可以用静态hashMap来实现将会很容易,并且不需要另一张表。 – Dileep

+0

自己实现这一切的所有可能的陷阱是我一直试图避免的事情。我有点希望那样的事情已经完成了。 – Manjabes