如何从现有代码中制作简单的工作流程?

时间:2014-09-24 11:15:05

标签: java workflow

我创建了几个任务,每个任务都有一个输入,一个不断更新状态的执行函数,以及一个输出此任务的函数。它们将以串行或并行方式执行。有些输出是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类,输入和输出以及执行函数并让它执行吗?

7 个答案:

答案 0 :(得分:4)

在Java世界中,您的用例称为BPM(业务流程管理)。

在.Net世界中,这被称为Windows Workflow Foundation(WWF)。

有许多基于Java的开源BPM工具。我喜欢的是jBPM

这功能更强大,可以与Drools等规则引擎集成。

示例jBPM屏幕截图: jBPM Diagram

同样Activiti是另一个不错的选择。

示例Activiti屏幕截图: Activiti Diagram

答案 1 :(得分:2)

结帐Activity。这并不是为了解决您的用例而设计的,但您可以使用并调整它的流程引擎来帮助您,因为它纯粹是用java编写的。 Activity更像是流程建模引擎,因此它不是为了控制在运行时并行运行的任务而设计的,因此你可以获得许多可以“开箱即用”重用的东西。

  • 您将获得基于xml文件链接的任务
  • 你将获得免费链接任务的gui(基于eclipse)
  • 您将在Web浏览器中获取GUI以浏览正在运行的进程,启动新进程并查看任务的当前状态:http://activiti.org/userguide/index.html#N12E60
  • 您将免费获得报告引擎,您可以在其中查看报告和图表(“任务需要多长时间”,“流程运行的时间”
  • 您将免费获得REST API。其他应用程序将能够通过简单的REST调用获取应用程序的当前状态

因此,朝着这个方向前进,你将获得免费的许多东西。从程序员的角度来看,您可以从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

另请查看Work Flow in Camel vs BPM

答案 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拓扑;不同的任务是流;任务中的不同方法与spoutsbolts相对应。此外,Storm在其API中支持多种编程语言,如Hadoop。

Storm最初由Twitter设计,然后开源,类似于其他项目,如Cassandra(Facebook)和Hadoop本身(Yahoo!)。作为用户,这对您来说意味着它是为实际使用而构建的,而不是纯粹的理论概念。它也经过了严峻的考验。

我希望这对你有用,祝你项目好运!