jBPM4工作流开发实战 之 第三部分 jBPM4开发
定义start活动的意义在于指定了一个流程实例应该从哪里开始,即流程定义的入口。 start活动的子元素<transition>用来指定流出的转移,指向流程的下一个活动。定义end活动的意义在于结束了一个流程实例,即流程定义的结束点。 特殊的end-cancel和end-error在一些特定的流程里,需要区分到底是为什么结束的,怎么结束的。比如,前面的差旅费报销申请流程,可以被批准进而正常的结束;也可以被某位领导不批准进而被取消。在一般的流程里,不需要区分end和end-cancel,但是如果再做的精细一点,可以让不同的结果,流向不同的结束。定义state活动作为一个等待状态活动。流程处理的流向会在外部调用提供的触发器API之前一直等待。与task相同的是,流程引擎会停在这里等待外界的调用;但不同的是,它不会将任务分配给某个人。 相关api如果是同时只有单个state的情况,可以简单的使用:executionService.signalExecutionById(“这里默认使用流程实例的id");如果是同时有多个state的话,应该要先查找到Execution的id,如下使用:ExecutionService exe = engine.getExecutionService();Execution e = exe.createProcessInstanceQuery().processInstanceId(piid).uniqueResult().findActiveExecutionIn(“state活动名称");exe.signalExecutionById(e.getId());定义decision活动会运行并判断其中的每一个transition元素里的转移条件。当遇到一个transition的condition值为true的时候,那么流程就立即流向这个transition。流程引擎并不会等待decision活动,它会马上执行完这个decision。decision活动的expr属性用一个三目运算符来判断到底要流向哪个transition。decision活动的transition元素的condition子元素用expr属性来判断是否流向这个transition。decision活动的handler子元素以上两种判断方式仍然没法完全满足我们的要求,还可以通过实现DecisionHandler接口来在java代码中决定到底到底流向哪个transition。
java代码:查看复制到剪贴板打印
- public class MyDecisionHandler implements DecisionHandler{
- @Override
- public String decide(OpenExecution execution) {
- Integer age = (Integer) execution.getVariable("age");
- if (age>=20){
- return "yes";
- }else{
- return "no";
- }
- }
- }
java代码:查看复制到剪贴板打印
- ProcessEngine processEngine = Configuration.getProcessEngine();
- TaskService taskService = processEngine.getTaskService();
- taskService.takeTask(“task的id”, “领取task的人员");
java代码:查看复制到剪贴板打印
- ProcessEngine processEngine = Configuration.getProcessEngine();
- IdentityService identityService = processEngine.getIdentityService();
- identityService.createGroup("sales");
- identityService.createUser(“zhang", “zhang", “san");
- identityService.createUser(“li", “li", “si");
- identityService.createMembership(“zhang", "sales");
- identityService.createMembership(“li", "sales");
java代码:查看复制到剪贴板打印
- public class MyAssignmentHandler implements AssignmentHandler{
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) { this.name = name; }
- public void assign(Assignable assignable, OpenExecution execution) throws Exception {
- assignable.setAssignee(name);
- }
- }
java代码:查看复制到剪贴板打印
- <task name="task1" g="339,146,92,52">
- <assignment-handler class="cn.javass.test.task.handler.MyAssignmentHandler">
- <field name="name">
- <string value="ok"/>
- </field>
- </assignment-handler>
- <transition to="end1"/>
- </task>
java代码:查看复制到剪贴板打印
- public class MyJava {
- private String user1;
- private String user2;
- …user1和user2的setter
- public String sayHello(String arg1,String arg2){
- System.out.println("user1=="+user1);
- System.out.println("user2=="+user2);
- System.out.println("arg1=="+arg1);
- System.out.println("arg2=="+arg2);
- return “Hello";
- }
- }
java代码:查看复制到剪贴板打印
- <java g="246,135,92,52" name="java1" class="cn.javass.test.java.MyJava" method="sayHello" var="manager">
- <field name="user1"><object expr=“#{user1}”/></field>
- <field name="user2"><string value="user2“/></field>
- <arg><string value="xyz“/></arg>
- <arg><object expr="#{abc}“/></arg>
- <transition to="task1"/>
- </java>
java代码:查看复制到剪贴板打印
- <sql g="192,438,92,52" name="sql1" unique="true" var="sqlV">
- <query>
- select * from tbl_user where uuid=:uuid
- </query>
- <parameters>
- <object name="uuid" expr="#{uuid}"></object>
- </parameters>
- <transition to="hql1"/>
- </sql>
- <hql name="hql1" g="404,457,92,52" unique="true" var="hqlV">
- <query>
- select o from Parent o where o.id=:id
- </query>
- <parameters>
- <string name="id" value="22"/>
- </parameters>
- <transition to="task2"/>
- </hql>
java代码:查看复制到剪贴板打印
- <foreach name="foreach1" in="D1,D2,D3" var="nowDep">
- <transition to="task5"/>
- </foreach>
- <task name="task5">
- <transition to="join1"/>
- </task>
- <join name="join1" multiplicity="3">
- <transition to="task6"/>
- </join>
java代码:查看复制到剪贴板打印
- <rules name="rule1">
- <fact var="um"></fact>
- <transition to="exclusive2"/>
- </rules>
- <decision name="exclusive2">
- <transition name="toT7" to="task7">
- <condition expr="#{um.canDrink}"/>
- </transition>
- <transition name="toT8" to="task8">
- <condition expr="#{!um.canDrink}"/>
- </transition>
- </decision>
java代码:查看复制到剪贴板打印
- Map map = new HashMap();
- UserModel um = new UserModel();
- um.setUuid("11");
- um.setAge(50);
- map.put("um", um);
- exe.startProcessInstanceByKey("h2",map);
java代码:查看复制到剪贴板打印
- public class MyEventListener implements EventListener{
- public void notify(EventListenerExecution exection) throws Exception {
- System.out.println("走出Decistion");
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <process name="test9" xmlns="http://jBPM.org/4.4/jpdl">
- <on event="start">
- <event-listener class="cn.javass.test.event.MyEventListener1">
- <field name="haha">
- <object expr="#{uuid}"/>
- </field>
- </event-listener>
- </on>
- <start name="start1" g="84,115,48,48">
- <transition to="task1"/>
- </start>
- <end name="end1" g="778,120,48,48"/>
- <task name="task1" g="358,124,92,52" assignee="wang">
- <on event="start">
- <event-listener class="cn.javass.test.event.MyEventListener3">
- </event-listener>
- </on>
- <transition name="yes" to="end1" g="-47,-17">
- <event-listener class="cn.javass.test.event.MyEventListener5"/>
- </transition>
- <transition name="no" to="task2" g="-53,-17"/>
- </task>
- <task name="task2" g="536,218,92,52" assignee="zhang">
- <transition to="end1"/>
- </task>
- </process>
- 1楼llhhyy198911小时前
- 我也想学习了解jbpm,有机会交流交流,嘻嘻。可以回访我博客啊