Jbpm实践项目4——ControlledProcessComposed

 

【功能设计】

由于Jbpm自带的子流程节点<process-state/>其中子流程名称必须是写死的,所以不能实现流程间的动态调用,而本实例的优点在于:

1.       实现流程间的动态调用;在执行流程的类中,自己控制得到哪个子流程的事例,如何执行这个子流程;

2.       实现了最小化的生成流程实例;每次执行时想实例化哪个子流程就实例化哪个,不用讲所有的子流程均实例化(这样和Jbpm自带的子流程节点的理念相同);

【流程设计】

1.       设计流程;

1) 建立JbpmProjectControlledProcessComposed);

2) 设计ProcessDefinition.xml;本例子中有3个流程:

(1)       Sample:有两个变量ServiceIDmesssage,根据传入的ServiceID来给message赋值(SampleAction ,打印“I'm Sample Process!

(2)       Sample1:两次调用(Sample1Action),在该Action中打印“I'm Sample1 Process!

(3)       Sample2:两次调用(Sample2Action),在该Action中打印“I'm Sample 2Process!

3) 设计aciton;内容如上所述;

2.       流程部署(com.sample.deploy);

1 导入MySQLDriver包;

2 修改Hibernate配置文件;

4)  设计部署类;

(1)     在该例子中各个流程之间是独立的,所以部署的时候没有顺序的问题;

(2)     只要写三次:得到JbpmConfigurationè得到JbpmContextè将相应的流程定义文件转化成inputStreamè该流转化为ProcessDefinitionèProcessDefinition部署在JbpmContext中;

3.       设计调用流程的类(com.sample.execution);

1) 初始化JbpmConfiguration,和JbpmContext,它们代表了流程引擎;

2) 控制流程内的执行,得到流程实例后利用token来控制流程一个一个节点的执行,所以要求自动节点必须与手动节点结合使用;

3) 流程间的调用,根据判断条件判断再实例化新的流程实例,再实行完被调用示例后继续执行主调流程(当执行被调流程时主调的Token是停下来的)。

4.       将流程发布为WebServicecom.sample.webService);

1) My EclipseèAdd XFire WebService Capabilities

2) 建立WebService

3) My EclipseèAdd We Project Capabilities

4) 发布、调用该WebService

【小结】

1.       Jbpm自带的子流程节点在部署时必须先部署子流程,在部署父流程。因为如果反过来父流程在部署到该节点时将找不到其需要的流程;

而本实例中写的各个流程在部署的时候都是独立的,所以不存在顺序的问题,它们之间的联系是在运行“执行流程类”的时候随机产生的;

2.       提示:ERROR Delegation : couldn't load delegation class…..的问题:

很有可能是就是该类没有部署在数据库中,如果确实是部署上了还是不行,可以尝试重新写个类,内容不变来替代它,别在上浪费太多时间。

3.       流程的执行过程:(该流程中包括三个节点)

1)       event 'process-start'使Token指到流程定义上;

2)       event 'before-signal'使Token指到“Start”节点;

3)       event 'node-leave'使Token指到“Start”节点;

4)       event 'transition'使Token指到“Start”节点的“Transition”上;

5)       executing action 'action[ActionName]'

6)       event 'node-enter' on 'State(first)' for 'Token(/)

7)       event 'after-signal' on 'StartState(start)' for 'Token(/)'

8)       event 'before-signal' on 'State(first)' for 'Token(/)'

9)       event 'node-leave' on 'State(first)' for 'Token(/)'

10)   event 'transition' on 'Transition(to_end)' for 'Token(/)'

11)   executing action 'action[action]'

12)   event 'node-enter' on 'EndState(end)' for 'Token(/)'

13)   event 'process-end' on 'ProcessDefinition(sample1)' for 'Token(/)'

14)   event 'after-signal' on 'State(first)' for 'Token(/)'

你可能感兴趣的:(process)