1.工作流的应用
一个电子政务系统中报文审批这一工作流程中的每个环节就组成了一个工作流,网上购物系统中从下定单到发货也是一系列的工作流程(其中包括用户取消定货和缺货等诸多环节),ERP系统中的工作流应用就更多了,从一个生产计划的下达、到供应科供应原材料、到车间生产、到产品进库等等诸多环节就是非常典型的工作流应用,可见,工作流的应用非常之广泛!
2.工作流系统的基本应用形式
工作流中的任务分为:human task和auto task,human task是需要用户干预的任务,auto task是由软件系统自己就可以完成的任务。对于human task,相关用户登录后,可以看到要归自己处理的任务。这些任务是何时和如何分配给相关用户的呢?这是由工作流引擎依据工作流的任务进行到了什么环节,然后查看这个任务由谁负责处理,再将任务分配给相关用户的。王涛引出的比喻,他将公司月报交给公司领导查看,公司领导通过后,再报交给上级单位,否则,打回到初始撰稿人重写撰写。工作流引擎相当于传递这个月报的秘书,这个秘书会从上一个环节取走月报,将它传递到下一个环节。
3.工作流系统不是一个简单的具体应用系统,而是一个工作流中间件,一个工作流框架。各种与工作流相关的应用都可以使用这个框架开快速开发出自己的最终工作流系统。这个框架中有一个WorkFlow类代表一个工作流,有多种形式Activity共同组合成一个工作流,Activity的具体形式包括:Start,End,Decision,Join,Split,Task,其中,Task是最重要的Activity,它代表工作流中具体要执行的任务,其他的Activity则是起辅助作用的,用于辅助实现工作流中的流程控制。
4.一个具体的工作流不是硬编码写出来的,而是通过Designer动态设计和配置出来的,Designer设计出一个工作流后,将这个工作流的各个环节以xml配置文件的形式存储起来,工作流引擎日后根据这个xml文件内容,就可以创建出一个具体的工作流系统。配置出的工作流就相当于一个模板,引擎依据模板启动的一个工作流是这个模板的实例,这有点类似java中的Class和Object的概念哦!
) 工作流管理系统模型通过eclipse的UML插件来构建了一个Class Diagram(类图), 如图…我来说说对这个图的理解… 这个类图是通过以下这个简单的工作流模型抽象出来的: 可以看到这个工作流程,有个起始节点叫start,工作流程通过工作流引擎启动后,通过这个工作流定义(上图为定义工作流)开始执行….然后我们再看看上面的类图: 最底层的start,task,join,split,decision,end这六个节点,对应的是我们现实实例中的那个工作流程,我们要有个面向对象的概念,来抽象出一个模型,这六个节点有个共同的动作(Activity),这是一个抽象类,抽象出了这六个节点所共有的属性,即:显示和传递上一个节点和下一个节点的状态.然后有个workflow,这是一个工作流定义(工作流定义的概念就是我感觉,就是给工作流引擎的工作地图,就像火车铁轨的作用一样,工作流引擎是基于工作流定义去工作的!).而variable中则存储了工作流定义中所用到的变量.最上层的wfObject,则是被抽象出来的activity,variable,workflow所共有的属性,可能会有id(工作号),name(名字)之类的共有属性.而在现实生活中存在的对象只有最底层的六个节点.这就是个一个面向对象的思想…通过抽象,建立模型,此例中体现出来的好处是减少了代码的重复,使工作流程细化(便于理解吧). 以下是实现这个工作流程的代码: 1.wfObject package com.itcast.workflow.model; public abstract class WfObject { public WfObject() {
super();
}
String id;
String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} } 2.Variable package com.itcast.workflow.model;
public class Variable extends WfObject { public Variable() {
super();
} int type; Object value; public int getType() {
return type;
} public void setType(int type) {
this.type = type;
} public Object getValue() {
return value;
} public void setValue(Object value) {
this.value = value;
} public static int TYPE_INT = 0; public static int TYPE_STRING = 1; public static int TYPE_BOOL = 2; }
3.workflow package com.itcast.workflow.model; import java.util.ArrayList;
import java.util.List;
public class Workflow extends WfObject { /**
*
*/
public Workflow() {
super();
}
public void addActivity(Activity activity){
this.activities.add(activity);
}
public void addVariable(Variable variable){
this.variables.add(variable);
}
List variables = new ArrayList();
List activities = new ArrayList();
public Start getStart(){
for(int i=0;i<activities.size();i++){
Activity activity = (Activity )activities.get(i);
if(activity instanceof Start){
start = (Start)activity;
}
}
return start;
}
Start start; } 4.工作流的定义: package com.itcast.workflow.designer;
import com.itcast.workflow.model.*;
public class Designer
{
public Designer()
{}
public static Workflow designWorkflow()
{
Workflow workflow = new Workflow();
workflow.setName("Hello Workflow");
Activity start = new Start();
Activity task1 = new Task();
Activity task2 = new Task();
Activity task3 = new Task();
Activity end = new End();
Join joinpt = new Join();
start.setName("start");
task1.setName("task1");
task2.setName("task2");
task3.setName("task3");
joinpt.setName("Join Point");
end.setName("end");
start.addNext(task1);
start.addNext(task2);
task1.addNext( joinpt);
task2.addNext( task3 );
task3.addNext( joinpt);
joinpt.addNext( end );
workflow.addActivity(start);
workflow.addActivity(task1);
workflow.addActivity(task2);
workflow.addActivity(task3);
workflow.addActivity(joinpt);
workflow.addActivity(end);
return workflow;
} }
5.工作流引擎 package com.itcast.workflow.engine; import com.itcast.workflow.model.Start;
import com.itcast.workflow.designer.*;
import com.itcast.workflow.model.Workflow; public class WorkflowEngine {
public WorkflowEngine() {
super();
}
public static void startWorkflow(Workflow workflow){
Start start = workflow.getStart();
start.active();
}
public static void main(String[] args){
Workflow workflow = Designer.designWorkflow();
WorkflowEngine.startWorkflow(workflow);
} }
6.activity package com.itcast.workflow.model; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public abstract class Activity extends WfObject
{
public static final int STATUS_ACTIVE=0;
public static final int STATUS_EXECUTE=1;
public static final int STATUS_COMPLETE=2;
public static final int STATUS_INACTIVE=-1;
private int status = STATUS_INACTIVE;
List<Activity> previous = new ArrayList<Activity>();
List<Activity> nexts = new ArrayList<Activity>();
public Activity()
{
super();
}
public void addNext(Activity activity)
{
this.nexts.add(activity);
activity.addPrevious(this);
}
private void addPrevious(Activity activity)
{
this.previous.add(activity);
}
public int getStatus()
{
return status;
}
void setStatus(int status)
{
this.status = status;
}
public List getNexts()
{
return nexts;
}
public List getPrevious()
{
return previous;
}
public void active()
{
log.info(" ******************************************************");
log.info(" my name is : " + name + " and i enter active() , the time is : " + new Date(System.currentTimeMillis()));
this.setStatus(Activity.STATUS_ACTIVE);
if(doActive())
{
execute();
}
}
boolean doActive()
{
return true;
}
public void execute()
{
log.info(" my name is : " + name + " and i enter execute() , the time is : " + new Date(System.currentTimeMillis()));
this.setStatus(Activity.STATUS_EXECUTE);
if(doExecute())
{
complete();
}
}
boolean doExecute()
{
return true;
}
public void complete()
{
this.setStatus(Activity.STATUS_COMPLETE);
log.info(" my name is : " + name + " and i enter complete() , the time is : " + new Date(System.currentTimeMillis()));
for(int i=0;i<nexts.size();i++){
Activity activity = (Activity )nexts.get(i);
activity.active();
}
}
private static final Log log = LogFactory.getLog(Activity.class); } 4.已经实现的Join节点 package com.itcast.workflow.model; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class Join extends Activity
{
private static final Log log = LogFactory.getLog(Activity.class);
boolean doActive()
{
for( Activity a : super.previous)
{
if( a.getStatus() != Activity.STATUS_COMPLETE )
{
log.info(a.getName() + " is not complete!");
return false;
}
}
log.info( "Join point has got through!" );
return true;
}
} 在这个工程中用到了log4j来实现输出…在Eclipse中注意把log4j的jar包和xml配置文件导入…