- 浏览: 661029 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (141)
- java (58)
- SQL (7)
- java开源 (2)
- javascript (3)
- struts2 (2)
- oracle (6)
- junit (1)
- js报表 (1)
- jQuery (5)
- 插件安装 (1)
- myeclipse (1)
- xfire (1)
- weblogic (1)
- hibernate (6)
- loading (1)
- jbpm (3)
- 物语 (0)
- android (14)
- spring (20)
- BigDecimal (1)
- view (1)
- 总结 (2)
- application (1)
- Netty (5)
- aop (1)
- redis (7)
- double (1)
- restful (1)
- cache (3)
- profile (1)
- redisTemplate (1)
- poi (3)
- excel导出 (1)
- mysql (7)
- group (4)
- replication (4)
- proxysql (1)
- windows (1)
- version (1)
- mongodb (2)
- RocketMQ (1)
- MQ (1)
- RSA (1)
- 日志 (2)
- ip (1)
- socket (1)
- hibernate-validator (1)
- delayQueue (1)
- spring-retry (1)
- rabbitmq (3)
- httpclient (1)
- tools (1)
- 增量发布 (1)
- web (3)
- spring-boot (5)
- druid (2)
- pageHelper (1)
- freemarker (1)
- RequestMapping (1)
- 性能优化 (2)
- springBoot (1)
- docker (2)
- 安全 (0)
- 国际化 (3)
- websocket (1)
- stomp (1)
- shiro (1)
- 网络安全 (2)
- 锁 (1)
- logback (1)
最新评论
-
changerzhuo_319:
谢谢大佬, 查了一天了没解决
Spring-boot构建多模块依赖工程时,maven打包异常:程序包xxx不存在 -
迪伦少校:
spring越来越优秀的同时,也越来越复杂
spring核心技术(1) -
hbxflihua:
ivi13 写道这种方式会有个问题,假如有个商户的交易量特别大 ...
使用spring-retry实现支付系统异步通知 -
ivi13:
这种方式会有个问题,假如有个商户的交易量特别大,通知全部失败, ...
使用spring-retry实现支付系统异步通知 -
ckxlnd:
挺好的 有借鉴意义
重写DispatcherServlet获取springmvc 所有RequestMapping的url
活动标签
-控制流程的活动
-原子活动
控制流程的活动
Start 开始节点,一个(主)流程只能有一个开始节点
End 结束节点,一个流程可以有多个结束节点
Decision 条件判断节点,当一个流程出现多个分支(情况),而分支排他时使用。
Fork 分支节点,当一个流程出现多个分支,而分支并列执行时使用。
Join 聚合/联合节点,通常与fork节点一起使用。
Sub-process 子流程(本人未曾使用过)
State 状态节点 一个暂停节点,当需要对流程的执行进行控制时使用。
Task 任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务
原子活动
Java、Script、Sql、Hql、Email
下面介绍三个最常用的活动
一个强制流程暂停的节点,当需要对流程的执行进行控制时使用。该节点可能什么都不需要做,也可能执行一些的操作。比如,路过银行,你拍怕裤兜,看看钱够还是不够。如果钱还可以花一段时间,你就不会去取钱。如果钱不多了,你就会去银行取些现金。或是钱本来就够花,但外面在下着雨,你想取避一避雨也不是不可以。State要做的相当于带你路过银行,至于你取不取钱,取多少,还是为了别的什么,不是它说了算,而是你自己的决定。 第一种方式:无分支的State
测试代码如下:
执行结果如下:
第二种方式:有分支的state
测试代码如下:
executionService.signalExecutionById(processInstance.getId(),"to boy"); 这句如果改为: executionService.signalExecutionById(processInstance.getId()); 则流程不会往下执行,流程继续停留在proot节点。 条件判断节点,当一个流程出现多个中情况而各种情况都排他时使用,相当于switch case. 第一种方式:decision内置condition 测试代码如下: 控制台输出结果如下:
第二种方式:为decision活动设置expr
测试代码如下:
控制台输出结果如下:
第三种方式:为decision配置handler
Handler类: 测试代码如下:
控制台输出结果如下:
以上三种方式差别都不是很大,第三中在程序中通过Handler进行复杂的处理。个人觉得,如果对于逻辑不是很复杂的操作,前两种方式是比较可取的。但如果逻辑过于复杂,或者还有其他的操作比如同步数据库中的其他信息等操作时,不妨选择第三种方式。 这些代码代码比较简单,这里就不做过多的解释。 任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务. Task的assignee属性 第一, assignee用来指示用户,负责完成任务的人。分配人是一个任务中的字符串属性,引用一个用户。(直接指定一个字符串) 第二,这个属性默认会当做表达式来执行。(指定一个表达式,然后在代码里为该表达式赋值) 如:在这里任务被分配给#{order.owner}。这意味着首先使用order这个名字查找一个对象。 其中一个查找对象的地方是这个任务对应的流程变量。 然后getOwner()方法会用来获得用户id, 引用的用户负责完成这个任务。 测试代码如下:
控制台输出结果如下:
state
<?xml version="1.0" encoding="UTF-8"?>
<process name="simpleState" xmlns="http://jbpm.org/4.3/jpdl">
<start name="start1" g="368,117,48,48">
<transition name="to state" to="state" g="-59,-17"/>
</start>
<end name="end" g="372,396,48,48"/>
<state name="state" g="348,250,92,52">
<transition name="to end" to="end" g="-47,-17"/>
</state>
</process>
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("simpleState");
System.out.println("流程实例Id:"+
processInstance.getId());
System.out.println("流程定义Id:"+
processInstance.getProcessDefinitionId());
System.out.println("是否在 state节点:"+
processInstance.isActive("state"));//true
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
processInstance =
executionService.signalExecutionById(processInstance.getId());
System.out.println("是否在 state节点:"+
processInstance.isActive("state"));//true
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
流程实例Id:simpleState.7
流程定义Id:simpleState-1
是否在 state节点:true
判断流程是否结束:false
**************
是否在 state节点:false
判断流程是否结束:true
<?xml version="1.0" encoding="UTF-8"?>
<process name="compState" xmlns="http://jbpm.org/4.3/jpdl">
<start name="start1" g="300,106,48,48">
<transition name="to proot" to="proot" g="-59,-17"/>
</start>
<end name="end" g="315,448,48,48"/>
<state name="proot" g="281,223,92,52">
<transition name="to boy" to="boy" g="-59,-17"/>
<transition name="to girl" to="girl" g="-59,-17"/>
</state>
<state name="boy" g="187,346,92,52">
<transition name="to end" to="end" g="-47,-17"/>
</state>
<state name="girl" g="383,342,92,52">
<transition name="to end" to="end" g="-47,-17"/>
</state>
</process>
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("compState");
System.out.println("是否在 proot节点:"+
processInstance.isActive("proot"));//true
System.out.println("是否在 boy节点:"+
processInstance.isActive("boy"));//false
System.out.println("是否在 girl节点:"+
processInstance.isActive("girl"));//false
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
processInstance =
executionService.signalExecutionById(processInstance.getId(),"to boy");//因为proot往下有多个分支,如果不指定流程转向,流程不会继续往下执行
System.out.println("是否在 proot节点:"+
processInstance.isActive("proot"));//false
System.out.println("是否在 boy节点:"+
processInstance.isActive("boy"));//true
System.out.println("是否在 girl节点:"+
processInstance.isActive("girl"));//false
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
decision
<?xml version="1.0" encoding="UTF-8"?>
<process key="deci" name="deci" xmlns="http://jbpm.org/4.3/jpdl">
<start g="358,77,48,48" name="start1">
<transition g="-83,-17" name="to exclusive1" to="exclusive1"/>
</start>
<end g="374,510,48,48" name="end"/>
<decision g="358,219,48,48" name="exclusive1">
<transition g="-59,-17" name="to 200" to="200">
<condition expr="#{errorcode == 200}"/>
</transition>
<transition g="-59,-17" name="to 404" to="404">
<condition expr="#{errorcode == 404}"/>
</transition>
<transition g="-59,-17" name="to 500" to="500">
<condition expr="#{errorcode == 500}"/>
</transition>
</decision>
<state g="194,351,92,52" name="200">
<transition g="-47,-17" name="to end" to="end"/>
</state>
<state g="340,349,92,52" name="404">
<transition g="-47,-17" name="to end" to="end"/>
</state>
<state g="476,349,92,52" name="500">
<transition g="-47,-17" name="to end" to="end"/>
</state>
</process>
Map<String, String> variables = new HashMap<String, String>();
variables.put("errorcode", "200");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("deci", variables);
System.out.println("200 isActive:"+
processInstance.isActive("200"));//进入state 200,暂停
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程未结束,返回false
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//该方法返回processInstance如果不接收,processInstance还是原来的对象
//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
processInstance=
executionService.signalExecutionById(processInstance.getId());
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程结束,返回true
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
200 isActive:true
processInstance isEnd:false
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
********
processInstance isEnd:true
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<?xml version="1.0" encoding="UTF-8"?>
<process name="deciBaseExpr" xmlns="http://jbpm.org/4.3/jpdl">
<start name="start1" g="407,65,48,48">
<transition name="to exclusive1" to="exclusive1" g="-83,-17"/>
</start>
<end name="end1" g="418,497,48,48"/>
<decision name="exclusive1" g="409,207,48,48" expr="#{whatcode}">
<transition name="to 200" to="200" g="-59,-17"/>
<transition name="to 404" to="404" g="-59,-17"/>
<transition name="to 500" to="500" g="-59,-17"/>
</decision>
<state name="200" g="251,344,92,52">
<transition name="to end1" to="end1" g="-47,-17"/>
</state>
<state name="404" g="389,342,92,52">
<transition name="to end1" to="end1" g="-47,-17"/>
</state>
<state name="500" g="516,341,92,52">
<transition name="to end1" to="end1" g="-47,-17"/>
</state>
</process>
Map<String, String> variables = new HashMap<String, String>();
variables.put("whatcode", "to 404");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("deciBaseExpr", variables);
System.out.println("200 isActive:"+
processInstance.isActive("200"));//返回false
System.out.println("404 isActive:"+
processInstance.isActive("404"));//返回true
System.out.println("500 isActive:"+
processInstance.isActive("500"));//返回false
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程未结束,返回false
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//该方法返回processInstance如果不接收,processInstance还是原来的对象
//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
processInstance=
executionService.signalExecutionById(processInstance.getId());
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程结束,返回true
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
200 isActive:false
404 isActive:true
500 isActive:false
processInstance isEnd:false
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
***************
processInstance isEnd:true
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<?xml version="1.0" encoding="UTF-8"?>
<process name="deciByHandler" key="deciByHandler" xmlns="http://jbpm.org/4.3/jpdl">
<start name="start1" g="341,55,48,48">
<transition name="to exclusive1" to="exclusive1" g="-83,-17"/>
</start>
<end name="end1" g="346,435,48,48"/>
<decision name="exclusive1" g="340,164,48,48">
<handler class="com.lihua.HandlerDecision"></handler>
<transition name="to 200" to="200" g="-59,-17"/>
<transition name="to 404" to="404" g="-59,-17"/>
<transition name="to 500" to="500" g="-59,-17"/>
</decision>
<state name="200" g="178,315,92,52">
<transition name="to end1" to="end1" g="-47,-17"/>
</state>
<state name="404" g="322,309,92,52">
<transition name="to end1" to="end1" g="-47,-17"/>
</state>
<state name="500" g="461,309,92,52">
<transition name="to end1" to="end1" g="-47,-17"/>
</state>
</process>
package com.lihua;
import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution;
public class HandlerDecision implements DecisionHandler {
private static final long serialVersionUID = -1639139174140348966L;
@Override
public String decide(OpenExecution execution) {
return (String) execution.getVariable("towhere");
}
}
Map<String, String> variables =
new HashMap<String, String>();
variables.put("towhere", "to 500");
ProcessInstance processInstance =
executionService.
startProcessInstanceByKey("deciByHandler", variables);
System.out.println("200 isActive:"+
processInstance.isActive("200"));//返回 false
System.out.println("404 isActive:"+
processInstance.isActive("404"));//返回 false
System.out.println("500 isActive:"+
processInstance.isActive("500"));//返回 true
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程未结束,返回false
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//该方法返回processInstance如果不接收,processInstance还是原来的对象
//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
processInstance=
executionService.signalExecutionById(processInstance.getId());
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程结束,返回true
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
200 isActive:false
404 isActive:false
500 isActive:true
processInstance isEnd:false
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
************
processInstance isEnd:true
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Task
<?xml version="1.0" encoding="UTF-8"?>
<process name="task" xmlns="http://jbpm.org/4.3/jpdl">
<start name="start1" g="390,97,48,48">
<transition name="to task" to="task" g="-53,-17"/>
</start>
<end name="end1" g="391,362,48,48"/>
<task name="task" g="368,239,92,52" assignee="${taskAssignee}">
<transition name="to end1" to="end1" g="-47,-17"/>
</task>
</process>
Map<String,String> map=
new HashMap<String, String>();
map.put("taskAssignee", "lihua");
ProcessInstance processInstance=null;
for (int i = 0; i < 2; i++) {
processInstance=executionService.
startProcessInstanceByKey("task",map);
System.out.println("流程是否处于task节点:"+
processInstance.isActive("task"));//true
System.out.println("流程实例Id:"+
processInstance.getId());
}
List<Task> list=taskService.findPersonalTasks("lihua");
for (Task task : list) {
System.out.println("任务活动名称:"+
task.getActivityName());
System.out.println("流程实例Id:"+
task.getExecutionId());
System.out.println("任务活动Id:"+
task.getId());
System.out.println("任务活动创建时间:"+
task.getCreateTime());
System.out.println("任务活动进度:"+
task.getProgress());
System.out.println("任务活动分配给:"+
task.getAssignee());
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
流程是否处于task节点:true
流程实例Id:task.7
************
流程是否处于task节点:true
流程实例Id:task.11
*****************
任务活动名称:task
流程实例Id:task.11
任务活动Id:13
任务活动创建时间:2012-02-16 15:48:50.406
任务活动进度:null
任务活动分配给:lihua
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
任务活动名称:task
流程实例Id:task.7
任务活动Id:9
任务活动创建时间:2012-02-16 15:48:50.375
任务活动进度:null
任务活动分配给:lihua
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1、在流程设置时如果出现乱码可在Eclipse.ini中添加如下配置:
-Dfile.encoding=UTF-8
2、在jbpm中表达式$(),#()均可以成功解析。
相关推荐
jbpm4.4 jar 包下载jbpm4.4 jar 包下载jbpm4.4 jar 包下载jbpm4.4 jar 包下载
jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd jbpm4.4 schema.xsd
JBPM4.4之HelloWorld示例
JBPM4.4与SSH2之整合(附完整源码) 这些天,想着把jbpm4.4与ssh2整合一下,由于之前从来没用过jbpm,也不知道各版本之间会有什么差异(经过网上的收集对比,还真有些差异),整合起来,还真是有些步履艰难。收集了...
jbpm4.4下载地址
jBPM4.4开发指南 开发手册 JBPM4.4 开发
jbpm4.4开发指南,jbpm4.4用户指南
jBPM4.4入门开发实例
资源名称:JBPM4.4视频教程(22集附源码)资源目录:【】(01)jbpm4.4简介【】(02)JBPM4.4开发环境搭建【】(03)jbpm4.4环境搭建续【】(04)jbpm4.4配置文件和开发前准备【】(05)jbpm4.4部署流程发起流程实例【】(06)...
首先感谢原创,相关信息请查询原创。... 看到好多朋友找不到相应的jar包,致使jbpm4.4的学习遇到困难,现提供除jbpm4.4自身jar包外的所有包,以便大家更快的学习jbpm4.4,希望能帮朋友们少走弯路!
jBPM4.4课程文档
JBPM4.4学习文档.ppt
jbpm4.4+ssh配置
终于把jbpm4.4上传完了,由于csdn最大容量才50m,所以我把这个jar包分成三个部分。
jBPM4.4数据库表简单介绍
jbpm4.4 ibatis-spring 整合
jBPM 4.4开发指南,翻译官方文档 JBoss jBPM Teams
jbpm4.4整合s2sh 请假流程例子
NULL 博文链接:https://hbxflihua.iteye.com/blog/1407756
jBPM 4.4 用户手册 中文版 PDF格式