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 ...
随机推荐
- String 和 new String
String s1=”welcome”; String s2= “welcome:; String s3 =new String(”welcome”); //新建对象 指向新的内存 比较内容 ...
- HTML5总结
HTML的定义 HyperText Markup Language 超文本标记语言 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中的各个部 ...
- java客户端调用webService
啥也不想说,以前使用的方法突然不行了.各种网搜(记得别忘记到jar包哦:axis.jar) 看代码,第一种方式,也就是以前的方式: 改方式不用表名参数名称 public static String i ...
- SpringMVC--入门案例
一.SpringMVC介绍 SpringMVC和Struts都属于表现层框架, 是Spring的一部分,Spring的整体结构如下: 1.1 SpringMVC的处理流程 下图是SpringMVC的执 ...
- What is the best way to handle Invalid CSRF token found in the request when session times out in Spring security
18.5.1 Timeouts One issue is that the expected CSRF token is stored in the HttpSession, so as soon a ...
- Thymeleaf利用layout.html文件生成页面布局框架
1.layout.html文件 生成布局 <!DOCTYPE html> <html lang="zh-CN" xmlns:th="http://www ...
- RESTful API 设计
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
- javascript快速入门之BOM模型—浏览器对象模型(Browser Object Model)
什么是BOM? BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对 ...
- fixed元素随滚动条无抖动滚动
页面上用fixed定位一个元素,随滚动条滚动位置不变,最开始我只用了css给元素身上写上fixed属性,发现滚动时元素会发生抖动,随后我就在网上找到解决办法,封装了个方法,如下: Css部分 此部分是 ...
- JDBC连接MySQL数据库基础
主要内容 MySQL的基本操作和基本SQL语法 使用JDBC进行MySQL数据库的开发 使用DriverManager.Connection.PreparedStatement.ResultSet对数 ...