Spring TaskExecutor中等效的ActiveMQ消息组

时间:2014-01-30 07:31:39

标签: java spring

ActiveMQ message groups抽象是否有Spring TaskExecutor的等价物?我们的想法是,当消费来自消息队列(使用消息组的ActiveMQ)的消息时,消息处理任务的执行将按顺序执行(处理来自消息组的消息的任务不会在之前开始任务处理来自该组的消息尚未完成。)

一个选项是抛弃TaskExecutor(在我的例子中是一个ThreadPoolTask​​Executor)并使用固定数量的工作线程,每个线程直接从MQ消耗,但是这会失去ThreadPoolTask​​Executor提供的执行灵活性,因此我是犹豫不决。

乍一看,春天似乎没有这样的功能,但是我拒绝相信我是第一个偶然发现这类问题并且之前没有解决的问题。任何见解欢迎:)

2 个答案:

答案 0 :(得分:1)

简单回答 - 没有。 TaskExecutor只是线程池的抽象,因此不了解线程之间的路由。根据您想要控制的具体方式,您是否考虑在Camel中编写一个简单的路径来控制消息到线程的路由?

答案 1 :(得分:1)

我不知道任何类似于 ActiveMq 的内容,可以与 Spring TaskExecutor 一起使用。

您的要求

  

“这个想法是,当从消息队列中消费消息时(   使用消息组的ActiveMQ),然后执行消息   处理任务将按顺序执行(任务处理a   来自消息组的消息不会在上一个任务之前启动   处理来自该组的消息尚未完成)。 “

我的建议:

  

您指定的要求可以在简单的Java中轻松执行。

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

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

  1. 将每个请求插入数据库。
  2. 根据要求获取数据。
  3. 根据您提取的数据构建所需的内容。
  4. 使用任务计划程序执行您需要执行的操作。
  5. 从数据库中删除数据。
  6. 我认为您使用某些自定义代码的要求没有太多麻烦。

    希望它有所帮助。祝你好运:)

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

    1使用您需要的所有元素创建一个Class文件。像id,name,Address等。

    2使用key作为分组值并HashMap arraylist作为值,创建一个静态最终className

    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现在,对于每个密钥,您将获得一个ArrayListClassName,其中包含所有带密钥的类

    这将像DB一样工作。在此示例中,您无法基于多个值进行条件调整。但根据您的要求,任何改变都是可能的。