【功能设计】
由于Jbpm自带的子流程节点<process-state/>其中子流程名称必须是写死的,所以不能实现流程间的动态调用,而本实例的优点在于:
1. 实现流程间的动态调用;在执行流程的类中,自己控制得到哪个子流程的事例,如何执行这个子流程;
2. 实现了最小化的生成流程实例;每次执行时想实例化哪个子流程就实例化哪个,不用讲所有的子流程均实例化(这样和Jbpm自带的子流程节点的理念相同);
【流程设计】
1. 设计流程;
1) 建立JbpmProject(ControlledProcessComposed);
2) 设计ProcessDefinition.xml;本例子中有3个流程:
(1) Sample:有两个变量ServiceID,messsage,根据传入的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. 将流程发布为WebService(com.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[Action的Name]';
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(/)';