我创建了几个任务,每个任务都有一个输入,一个不断更新状态的执行函数,以及一个输出此任务的函数。它们将以串行或并行方式执行。有些输出是List,所以也会有循环。
public class Task1 { //each task looks like this
void addInput(String key, String value){
....
}
void run(){
....
updateStatus();
....
}
HashMap getOutput(){
....
}
Status getStatus(){
....
}
}
我想从这些任务中创建一个工作流,然后我将使用工作流结构信息来构建动态GUI并监视每个任务的输出。我是否必须从头开始编写工作流程执行系统,或者是否有任何简单的替代方案?
我可以提供任何工作流引擎(在XML中可能是)我的Java类,输入和输出以及执行函数并让它执行吗?
答案 0 :(得分:4)
在Java世界中,您的用例称为BPM(业务流程管理)。
在.Net世界中,这被称为Windows Workflow Foundation(WWF)。
有许多基于Java的开源BPM工具。我喜欢的是jBPM。
这功能更强大,可以与Drools等规则引擎集成。
示例jBPM屏幕截图:
同样Activiti是另一个不错的选择。
示例Activiti屏幕截图:
答案 1 :(得分:2)
结帐Activity。这并不是为了解决您的用例而设计的,但您可以使用并调整它的流程引擎来帮助您,因为它纯粹是用java编写的。 Activity更像是流程建模引擎,因此它不是为了控制在运行时并行运行的任务而设计的,因此你可以获得许多可以“开箱即用”重用的东西。
因此,朝着这个方向前进,你将获得免费的许多东西。从程序员的角度来看,您可以从Activity api继承Task
类。任务完成后期致电
taskService.complete(task.getId(), taskVariables);
你也可以采取另一种方式。因此,假设您在后台计算的类称为CalculationTask,您可以将CalculatinTasks与Activity Task的新实例连接起来。通过这个,您将获得活动流程引擎的桥梁。所以你可以做类似
的事情class CustomActivityTask extends Task { // inherit from Activity Task class to add your own fields
private int someStateOne;
private String someOtherState;
(...)
// getters and setters
}
class CalculationTask {
private CustomActivityTask avtivityTask; // by updating the state of this task you are updating the state of the task in Activity process engine
private RuntimeService activityRuntimeServiece;
public void run() { // this is your execution functin
while (true) {
// calulate
activityTask.setSomeStateOne(45)
activityTask.setSomeOtherState("Task is almost completing...");
(...)
if (allCompleted) {
activityRuntimeServiece.complete(avtivityTask.getId(), taskVariables);
break;
}
}
}
答案 2 :(得分:2)
Apache Camel是一个开源集成框架,可用作轻量级工作流系统。可以使用Java,XML,Groovy或Scala DSL定义路由。 Apache Camel包含集成的监控功能。除此之外,您可以使用外部监控工具,例如Hawtio。
答案 3 :(得分:2)
也许State Chart XML (SCXML)可以帮到你。目前它是由W3C发布的工作草案规范
SCXML提供基于状态机的通用执行环境,基于Harel状态表。
apache基础提供了一个java实现,我们(我的公司)正在使用它来执行“作业”的状态转换。这是Apache Commons SCXML实现
答案 4 :(得分:2)
如果您的分析非常耗时并且您不需要立即反馈,那么除了批处理器之外,您可能根本不需要工作流引擎。查看可与Spring Batch一起使用的Camel Apache项目(有关此选项的更多信息,请参阅我的其他答案)。
答案 5 :(得分:1)
看一下Copper Engine http://copper-engine.org/
与Activiti等不同,它不需要编写大量的XML来实现简单的工作流程
答案 6 :(得分:1)
我肯定会考虑the Apache Storm project。 Storm被设计成一个易于扩展的并行计算引擎。在其众多功能中,其易于管理,容错和一般的简单设置(与Hadoop等其他类似技术相比,我相信)可能对您的原型系统具有吸引力。
工作流程类似于Storm拓扑;不同的任务是流;任务中的不同方法与spouts
和bolts
相对应。此外,Storm在其API中支持多种编程语言,如Hadoop。
Storm最初由Twitter设计,然后开源,类似于其他项目,如Cassandra(Facebook)和Hadoop本身(Yahoo!)。作为用户,这对您来说意味着它是为实际使用而构建的,而不是纯粹的理论概念。它也经过了严峻的考验。
我希望这对你有用,祝你项目好运!