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 - 工作流的基本操作的更多相关文章

  1. JBPM工作流入门总结

    关于JBPM工作流 1.工作流 工作流是一项分离业务操作和系统流程的技术.工作流由实体(Entity).参与者(Participant).流程定义(Flow Definition).工作流引擎(Eng ...

  2. 转发 JBPM工作流小结

    JBoss 题记:某部门领导有天突发奇想,把我们几个人叫过去,曰:最近出去开会,老有人推销自己的工作流产品,说的这好那好,你们几个给我研究研究.正好刚做完的xxx子系统里有一个申请审批的流程,你们按这 ...

  3. Jbpm工作流(一)

    了解一下什么是Jbpm及特点. jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统.jBPM是公开源代码项目,它使用要遵循 Ap ...

  4. JBPM——工作流概念

    一.概念          工作流(Workflow),就是"业务过程的部分或总体在计算机应用环境下的自己主动化",它主要解决的是"使在多个參与者之间依照某种提前定义的规 ...

  5. JBPM工作流

    一.开发环境的搭建 1.下载Jbpm4.4 1.1下载地址: https://sourceforge.net/projects/jbpm/files/jBPM%204/jbpm-4.4/ 1.2解压后 ...

  6. jbpm 工作流(二)

    1           概述 本文主要介绍如何将JBPM+Struts+Spring+Hibernate整合在一块.并通过一个简单实例来说明.此实例为一个申请审批的简单流程,并将申请人和审批人记录到数 ...

  7. JBPM工作流(一)——实现一个简单的工作流例子

    一.JBPM定义 JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可执行流 ...

  8. python调用Java代码,完毕JBPM工作流application

    1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...

  9. 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】

    一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...

随机推荐

  1. Python进阶开发之元类编程

    系列文章 √第一章 元类编程,已完成 ; 本文目录 类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战:ORM . 类是如何产生的 类是如何产生?这个问题肯定很傻.实则不然,很多 ...

  2. django+appium实现UI自动化测试平台---构思版

             背景 UI自动化,在进行的过程中,难免会遇到平台化, 在实际的工作中,有的领导也会想要实现自动化测试的平台化.自动化平台化后,有了更为实际的成果, 在做UI自动化,很想吧现在的自动化 ...

  3. msql索引

    从网上找了两种解决方案: 最近要给一个表加一个联合唯一索引,但是表中的两个联合健有重复值,导致无法创建: 解决方案一:ignore(会删除重复的记录(重复记录只保留一条,其他的删除),然后建立唯一索引 ...

  4. hyper-v 安装Centos及网络配置

    新安装的Centos系统默认情况下是不能上网的,需要经过相应的配置:选择对应的虚拟机,点击"虚拟交换机管理器": 设置hyper-v上的网络及分配cpu.内存.磁盘等资源. 安装C ...

  5. 3.python元类编程

     1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法.在python中他们对应的分别是属性self.xxx和类方法.但有时我们需要的属性需要根据 ...

  6. Ubuntu系统下解决“YourUserName不在sudoers文件中。此事将被报告”的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=624 问题描述: 之前在使用Fedora系统时遇到过在使用 sudo 时提示"YourUserName不在 ...

  7. InnoDB存储引擎结构介绍

    Ⅰ.InnoDB发展史 时间 事件 备注 1995 由Heikki Tuuri创建Innobase Oy公司,开发InnoDB存储引擎 Innobase开始做的是数据库,希望卖掉该公司 1996 My ...

  8. tkinter中entry输入控件(四)

    entry控件 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("300x200+ ...

  9. 1. 开篇-springboot环境搭建

    最初学习strurs2时,虽然觉得也挺好用的,但也有一些不便的地方:1. 模型绑定必须要在Action中声明对应模型的成员变量:2. Action中对外提供调用的接口必须明确注明:3. 要声明一大堆的 ...

  10. ATM机

    ATM 要求 示例代码: https://github.com/triaquae/py_training/tree/master/sample_code/day5-atm