jbpm - 工作流的基本操作
Jbpm流程引擎、
定义:jbpm,全称是Java Business Process Management(业务流程管理),他是覆盖了业务流程管理,工作流管理,服务协作等领域的一个开源的,灵活的,易扩展的可执行的流程语言框架。
作用:jbpm的流程框架非常灵活,使用起来也非常安全,降低开发的风险,同时jbpm拥有自己的图形化开发工具,非常方便随时了解和掌握运行的进程。
Jbpm的开发步骤
1、 引入jbpm 4.4 jar
2、 引入jbpm.cfg.xml、jbpm.hibernate.cfg.xml核心配置文件如图:
Jbpm.cfg.xml 配置:
<?xml version="1.0" encoding="UTF-8"?> <jbpm-configuration> <import resource="jbpm.default.cfg.xml" /> <import resource="jbpm.businesscalendar.cfg.xml" /> <import resource="jbpm.tx.hibernate.cfg.xml" /> <import resource="jbpm.jpdl.cfg.xml" /> <import resource="jbpm.bpmn.cfg.xml" /> <import resource="jbpm.identity.cfg.xml" /> <!-- Job executor is excluded for running the example test cases. --> <!-- To enable timers and messages in production use, this should be included. --> <!-- <import resource="jbpm.jobexecutor.cfg.xml" /> --> </jbpm-configuration> |
Jbpm.hibernate.cfg.xml 配置:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///jbpm</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.show_sql">true</property> <mapping resource="jbpm.repository.hbm.xml" /> <mapping resource="jbpm.execution.hbm.xml" /> <mapping resource="jbpm.history.hbm.xml" /> <mapping resource="jbpm.task.hbm.xml" /> <mapping resource="jbpm.identity.hbm.xml" /> </session-factory> </hibernate-configuration> |
Log4j.properties 配置:
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.err log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c:/mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=info, stdout |
3、 创建表结构 (有18张表)
4、 /** 5、 * 使用jbpm 方式创建表结构 18张表 6、 */ 7、 public void createTable() 8、 { 9、 org.jbpm.api.Configuration.getProcessEngine(); } |
流程引擎的使用步骤
1 、部署流程实例:
1、 public void deploy() 2、 { 3、 //通过Configuration 类构建流程引擎对象 4、 ProcessEngine processEngine = Configuration.getProcessEngine(); 5、 6、 //获取RepositoryService 接口服务 7、 RepositoryService repositoryService = processEngine.getRepositoryService(); 8、 9、 //发布的方式:零散发布 10、 repositoryService.createDeployment() 11、 .addResourceFromClasspath("jbpm_test.jpdl.xml") 12、 .addResourceFromClasspath("jbpm_test.png") 13、 .deploy(); 14、 } |
其他发布方式:
2、 启动流程实例:
public void startProcessInstanceByKey() { //通过Configuration 类构建流程引擎对象 ProcessEngine processEngine = Configuration.getProcessEngine(); //获取ExecutionService 对象 ExecutionService executionService = processEngine.getExecutionService(); executionService.startProcessInstanceByKey("jbpm_test"); //key 默认为流程文件名称 } |
3、查询个人任务
ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.findPersonalTasks("员工"); for(Task t:list) { System.out.println("任务编号:"+t.getId()); System.out.println("任务名称:"+t.getName()); } |
4、 办理个人任务
public void personalComplete() { ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = processEngine.getTaskService(); taskService.completeTask("50002"); //任务id } |
流程变量设置
public void taskComplete() { TaskService taskService = Configuration.getProcessEngine().getTaskService(); Map<String, User> userMap = new HashMap<String, User>(); User user = new User(); user.setDay(2); user.setName("小明"); userMap.put("user", user); //办理业务并设置流程变量 taskService.setVariables("240002", userMap); taskService.completeTask("240002"); } |
流程引擎ProcessEngine 的六大服务接口:
流程引擎processEngine 对象的获取:通过Configuration 类的构建如:
ProcessEngine processEngine = Configuration.getProcessEngine();
1、 RepositoryService 接口(流程资源服务):
RepositoryService service= processEngine.getRepositoryService()
作用:提供对流程的部署、删除、查询和流程图的查看操作。
常用方法:
部署流程实例:同【1】
查看流程实例:
public void processDefinitionInstanse() { ProcessEngine processEngine = Configuration.getProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); //获取查看流程实例的query对象 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); List<ProcessDefinition> list = processDefinitionQuery.list(); for(ProcessDefinition p:list) { System.out.println("流程对应的id:"+p.getId()); System.out.println("流程对应的名称:"+p.getName()); System.out.println("流程对应的key"+p.getKey()); System.out.println("版本:"+p.getVersion()); System.out.println(p.getDeploymentId()); } } |
ProcessDefinitionQuery常用方法:
ProcessDefinition常用方法:
删除流程实例:
public void deleteProcessDefinfition() { ProcessEngine processEngine = Configuration.getProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); /** * 删除方式一 * deleteDeployment(java.lang.String deploymentId) * 只能删除没有运行的流程实例。 */ repositoryService.deleteDeployment("40001"); /** * 删除方式二 * deleteDeploymentCascade(java.lang.String deploymentId) * 删除部署、包含的流程定义、相关流程实例及其历史信息 */ //repositoryService.deleteDeploymentCascade("40001"); //强制删除 } |
2、 ExecutionService 接口(流程执行服务接口):
ExecutionService execution = processEngine.getExecutionService()
作用:提供启动流程服务实例、推动、删除、等操作。
启动流程实例:如:【2】
推动流程:
public void signalExecutionById() { /** * 让流程向后执行一步 * signalExecutionById(java.lang.String executionId, java.lang.String signalName) * signaName: 下一个节点 transition 的 name */ ExecutionService executionService = Configuration.getProcessEngine().getExecutionService(); executionService.signalExecutionById("60001", "to 部门负责人"); } |
3、 TaskService 接口(人工任务服务):
TaskService taskService = processEngine.getTaskService()
作用:提供对任务的创建、提交、查询、删除等操作。
常用方法:
查询任务(TaskQuery):
public void personalTaskList() { ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = processEngine.getTaskService(); //获取任务查询对象 TaskQuery taskQuery = taskService.createTaskQuery(); //根据操作人查询任务列表 List<Task> list = taskQuery.assignee("员工").list(); //查询所有的任务列表 //List<Task> list = taskQuery.list(); for(Task t:list) { System.out.println("任务编号:"+t.getId()); System.out.println("任务名称:"+t.getName()); } } |
TaskQuery常用方法:
办理任务:
public void completeTask() { ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = processEngine.getTaskService(); taskService.completeTask("80002"); } |
4、 HistoryService接口(流程历史服务):
HistoryService history = processEngine.getHistoryService();
作用:提供对历史任务的关联操作、对历史库中历史流程实例、历史活动实例等、等记录的查询操作。
5、 ManagementService 接口:
ManagementService mservice= processEngine.getManagementService()
6、 IdentityService 接口:
IdentityService identitySerivce = processEngine.getIdentityService()
作用:身份认证服务接口。提供对流程用户、用户组管理。
流程图的组成
1、 活动 Activity /节点 node
2、 流转Transition /连线(单向箭头)
3、 事件
流转(transition)
1、 一般情况下一个活动可以指定一个或多个transition
开始活动(start)中只能有一个transition
结束活动(end)中没有transition
其他活动可以有一个或多个
2、 如果自有一个transition ,则可以不指定名称,如果有多个,则要分别指定唯一的名称
活动(activity)
1、 开始活动
代表流程的开始边界,一个流程有且自能有一个start活动,开始活动自能自定一个transition。在流程实例启动后,会自动的使用这个唯一的transition,到下一个活动
2、 End/end-error/end-cancel(结束活动)
带表流程的结束边界,可以有多个,也可以没有,如果有多个,则到达任一个活动,整个流程结束,如果没有,则到达最后一个transition活动,流程就结束
3、 State状态活动
作用:等待。可以使用signal 使其结束等待,并向后执行一步
判断活动(decision)
流程图如:
为其指定一个实现类:DecisionHandler
private static final long serialVersionUID = 1L; @Override public String decide(OpenExecution execution) { System.out.println("decide"); User user = (User) execution.getVariable("user"); int day = user.getDay(); System.out.println("请假天数:"+day); if(day > 3) { return "to 总经理审批"; } return "to end1"; } |
测试:
public void test() { //发布流程实例 ProcessEngine processEngine = Configuration.getProcessEngine(); processEngine.getRepositoryService() .createDeployment() .addResourceFromClasspath("com/jbpm_decision/jbpm_decision.jpdl.xml") .addResourceFromClasspath("com/jbpm_decision/jbpm_decision.png") .deploy(); Map<String, User> map = new HashMap<String, User>(); User user = new User(); user.setDay(2); user.setName("张三"); map.put("user", user); //启动流程实例 ProcessInstance p = processEngine.getExecutionService().startProcessInstanceByKey("jbpm_decision",map); String taskId = processEngine.getTaskService() .createTaskQuery() .processInstanceId(p.getId()) .uniqueResult() .getId(); System.out.println(taskId); //办理业务 processEngine.getTaskService().completeTask(taskId); } |
分支(fork)/聚合(join)活动
流程图:
从图中:可以看出两条分支(发货、汇款)是同时进行的。并且只有当两条分支都到达join活动,流程才会继续向后执行,
测试:
@Test public void test() { //获取流程引擎 ProcessEngine processEngine = Configuration.getProcessEngine(); //发布流程实例 processEngine.getRepositoryService() .createDeployment() .addResourceFromClasspath("com/jbpm_forjion/jbpm_forjion.jpdl.xml") .addResourceFromClasspath("com/jbpm_forjion/jbpm_forjion.png") .deploy(); //启动流程实例 processEngine.getExecutionService().startProcessInstanceByKey("jbpm_forjion"); } //查看个人任务 @Test public void taskQueryPersonel() { ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.createTaskQuery().list(); for(Task t:list) { System.out.println("任务id:"+t.getId()); System.out.println("任务名称:"+t.getName()); System.out.println("任务操作人:"+t.getAssignee()); } } @Test public void taskComplete() { //获取流程引擎 ProcessEngine processEngine = Configuration.getProcessEngine(); TaskService taskService = processEngine.getTaskService(); taskService.completeTask("20001"); } |
自定义活动(custion)
流程图:
实现 ExternalActivityBehaviour 接口:
//到达这个活动是执行方法 @Override public void execute(ActivityExecution aActivityExecution) throws Exception { System.out.println("xxxxxxxxxxxxxxxx execute xxxxxxxxxxxxxxxxxx"); //默认是执行完这个方法是 离开 //aActivityExecution.takeDefaultTransition(); //aActivityExecution.waitForSignal(); } //调用signal 方法离开当前节点执行的方法(如果在execute() 方法中离开则不执行该方法) @Override public void signal(ActivityExecution arg0, String arg1, Map<String, ?> arg2) throws Exception { System.out.println("xxxxxxxxxxxxxxxxxx signal xxxxxxxxxxxxxxxxxxxxxx"); } |
测试:
@Test public void test() { //发布流程实例 ProcessEngine processEngine = Configuration.getProcessEngine(); processEngine.getRepositoryService() .createDeployment() .addResourceFromClasspath("com/jbpm_custom/jbpm_custom.jpdl.xml") .addResourceFromClasspath("com/jbpm_custom/jbpm_custom.png") .deploy(); //启动流程实例 ExecutionService executionService = processEngine.getExecutionService(); ProcessInstance p = executionService.startProcessInstanceByKey("jbpm_custom"); System.out.println(p.getId()); } @Test public void signal() { //发布流程实例 ProcessEngine processEngine = Configuration.getProcessEngine(); ExecutionService executionService = processEngine.getExecutionService(); executionService.signalExecutionById("jbpm_custom.30008"); } |
事件
1、 在根元素或节点元素中,使用<on event=””> 元素指定事件,其中event属性代表事件的类型
2、 在<on>中用子元素<enent-listener class=”EventListenerImpl”/> 指定处理类,要求指定的类要实现EventListener接口
事件的类型
1、 <on>元素在根元素<process> 中,可以指定enent为start、end。表示流程的开始于结束。
2、 <on>元素在节点元素中,可以指定event为start、end.表示节点的进入与离开
3、 在start 节点中只有end事件,在end 节点中只有start事件
配置:
<?xml version="1.0" encoding="UTF-8"?> <process name="jbpm_event" xmlns="http://jbpm.org/4.4/jpdl"> <!-- 流程实例启动事件 --> <on event="start"> <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener> </on> <!-- 流程实例离开事件 --> <on event="end"> <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener> </on> <start name="start1" g="566,125,48,48"> <transition name="to task1" to="task1" g="-63,-25"/> </start> <end name="end1" g="564,498,48,48"/> <task name="task1" g="577,294,92,52" assignee="员工"> <transition name="to end1" to="end1" g="-62,-25"/> <!-- 进入活动事件 --> <on event="start"> <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener> </on> <!-- 离开活动事件 --> <on event="end"> <event-listener class="com.jbpm_event.EventListenerImpl"></event-listener> </on> </task> </process> |
jbpm - 工作流的基本操作的更多相关文章
- JBPM工作流入门总结
关于JBPM工作流 1.工作流 工作流是一项分离业务操作和系统流程的技术.工作流由实体(Entity).参与者(Participant).流程定义(Flow Definition).工作流引擎(Eng ...
- 转发 JBPM工作流小结
JBoss 题记:某部门领导有天突发奇想,把我们几个人叫过去,曰:最近出去开会,老有人推销自己的工作流产品,说的这好那好,你们几个给我研究研究.正好刚做完的xxx子系统里有一个申请审批的流程,你们按这 ...
- Jbpm工作流(一)
了解一下什么是Jbpm及特点. jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统.jBPM是公开源代码项目,它使用要遵循 Ap ...
- JBPM——工作流概念
一.概念 工作流(Workflow),就是"业务过程的部分或总体在计算机应用环境下的自己主动化",它主要解决的是"使在多个參与者之间依照某种提前定义的规 ...
- JBPM工作流
一.开发环境的搭建 1.下载Jbpm4.4 1.1下载地址: https://sourceforge.net/projects/jbpm/files/jBPM%204/jbpm-4.4/ 1.2解压后 ...
- jbpm 工作流(二)
1 概述 本文主要介绍如何将JBPM+Struts+Spring+Hibernate整合在一块.并通过一个简单实例来说明.此实例为一个申请审批的简单流程,并将申请人和审批人记录到数 ...
- JBPM工作流(一)——实现一个简单的工作流例子
一.JBPM定义 JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可执行流 ...
- python调用Java代码,完毕JBPM工作流application
1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...
- 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】
一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...
随机推荐
- Python_字符串查找与分隔
#字符串常用方法 s='apple,peach,banana,peach,pear' #返回第一次出现的位置 print(s.find('peach')) #指定位置开始查找 print(s.find ...
- 输入流IS和输出流OS学习总结
1.我们编写的程序,除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身的数据发送到外界,比如我们编写的程序想读取一个文本文件, 又或者是我们想将程序的一些数据写到一个文件中,这时我们就要 ...
- SpringMVC中Json数据格式转换
1 @RequestBody 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为 ...
- socket和webService的区别
网络七层协议为:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层 socket 只是 java在网络层定义的类,用来实现网络层.上面的各层需要我们自己在程序里实现. 例如端口可以自己定义 . ...
- window安装mysql5.7解压版(解决乱码问题)
♣安装mysql两种方法 ♣下载mysql5.7解压版 ♣配置步骤 ♣解决服务无法启动 ♣解决乱码 1.安装mysql两种方法 MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果 ...
- 静态代码扫描工具PMD定制xml的规则(一)操作篇
0.前言 PMD作为开源的静态代码扫描工具有很强的扩展能力,可使用java或xpath定制rule.第一篇从操作上讲解如何定制一个用于扫描xml是否规范的规则.首先我们知道xml格式的文件在java工 ...
- Securing Spring Cloud Microservices With OAuth2
From Zero to OAuth2 in Spring cloud Today I am presenting hours of research about a (apparently) sim ...
- Matlab与C混编的介绍
原本写给一个朋友的,帮助她入门matlab与C混编的 >#####环境: * Matlab:MATLAB R2013a * C编译器VC++2012 === #####配置环境: 在**Matl ...
- Javascript中没有块级作用域(模仿)
在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域).而在javascript中则没有块级作用域,首先来看一段代码: function test(){ for(var ...
- python类型转换convert实例分析
在python的开发过程中,难免会遇到类型转换,这里给出常见的类型转换demo: 类型 说明 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 ...