2011-02-06 83 views
14

我的问题是,是否存在用于管理和并发运行具有逻辑相关性的任务的Java框架。我的任务如下: 我有很多独立的任务(比如说A,B,C,D ...),它们被实现为命令(就像命令模式一样)。我希望有一种执行者可以接受所有这些任务并且以并行的方式执行它们。 任务可以相互依赖(例如,我不能运行C,在我运行A之前),同步或异步。用于管理任务的Java框架

我还想加入自定义的启发式方法来影响调度程序的执行,例如,如果任务A和B是CPU密集型的,而C是高内存消耗,那么运行A和C是有意义的并行,而不是运行A和B.

在我潜心于构建这个东西之前(我正在考虑java.util.concurrent +基于注解的约束/规则),我想知道,如果有人能指向我一些可以满足我需求的项目。 非常感谢

+0

看看Fork/Join? – 2011-02-06 12:32:25

+0

我不知道任务是否重复使用其他结果。如果他们是具有预定序列的独立工作单元,那么可以通过非常简单的自定义线程池执行器来解决调度和自定义启发式问题。 – 2011-02-07 01:32:41

回答

7

我不认为有一个管理任务可以满足您的要求的框架。您正在使用Command模式的正确路径。您可以查看Akka framework以获得简化的并发模型。阿卡是基于Actor模型:

的角色模型是另一种非常简单 高水平并发模型:演员 不能在同一时间超过一个消息 响应(消息排队到 邮箱)并且只能通过 发送消息进行通信,而不能共享 变量。只要消息 不可变的数据结构(这是 总是在二郎山真实的,但必须是在语言 约定不保证该物业 手段),一切 是线程安全的,而不需要任何 其他机制。这是非常类似的 要求在web 开发MVC框架中找到周期。 http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

Akka是用Scala编写的,但它暴露了干净的Java API。

2

我建议你考虑使用ant来达到这个目的的可能性。虽然ant被称为流行的构建工具,但它实际上是运行各种任务的XML控制引擎。我认为它的标志fork=true完全符合你的需求:同时运行任务。由于任何Java应用程序ant可以从其他Java应用程序执行:只需调用它的main方法即可。在这种情况下,您可以使用ant API封装您的任务,即将它们实施为Ant任务。

我从来没有尝试过这种方法,但我相信它应该可以工作。我几年前曾经考虑过这个问题,并建议我的管理层将其作为类似于您的问题的可能解决方案。

0

有一个框架,专门为此呼吁dexecutor(声明:我是老板)

Dexecutor是一种重量很轻的框架,以可靠的方式来执行依赖/独立的任务,要做到这一点,提供了最小的API。

  • 一个API来在图形添加节点(addDependency,addIndependent,addAsDependentOnAllLeafNodes,addAsDependencyToAllInitialNodes后来两个是前两个混合版本)
  • 和其他为了执行的节点。

这是最简单的例子:

DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor(); 

    executor.addDependency(1, 2); 
    executor.addDependency(1, 2); 
    executor.addDependency(1, 3); 
    executor.addDependency(3, 4); 
    executor.addDependency(3, 5); 
    executor.addDependency(3, 6); 
    //executor.addDependency(10, 2); // cycle 
    executor.addDependency(2, 7); 
    executor.addDependency(2, 9); 
    executor.addDependency(2, 8); 
    executor.addDependency(9, 10); 
    executor.addDependency(12, 13); 
    executor.addDependency(13, 4); 
    executor.addDependency(13, 14); 
    executor.addIndependent(11); 


    executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING); 

这里如何依赖图将被修建在 enter image description here

任务1,12,11将并行在这些任务运行时,一旦完成依赖任务将运行,例如,假设任务1完成,任务2和3将以类似方式运行一次任务12,完成任务13将运行等等。