大家好,欢迎来到IT知识分享网。
JBPM全称为Java BusinessProcess Management,业务流程管理,它覆盖了业务流程管理、工作流、服务协议等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。
工作流引擎给我们提供了流程逻辑的定义方法,给我们提供了根据流程逻辑来调度业务对象的功能,能使我们避免在代码中硬编码流程逻辑。下面我们在eclipse中安装JBPM的插件,在eclipse中集成插件的方法和大多数插件集成一样,这里不详细介绍。安装完插件需要配置插件运行的环境,然后引入所需要的JBPM jar包。再引入JBPM的jar包时还需要引入Hibernate的jar包,jbpm和hibernate一样都是JBoss公司的产品,其核心都是配置文件,在jbpm中有一个jbpm.cfg.xml配置文件和jbpm.hibernate.cfg.xml位置文件,
下面汇总JBPM中的基础知识点,对于深入的应用需要实践,在后面的博客我会详细介绍。
一、jbpm的相关jar包:
bsh.jar
jcr-1.0.jar
jbpm-identity.jar
jbpm-jpdl.jar
引入数据库驱动mysql-connector-java-3.1.13-bin.jar
二、提供相关的配置文件:jbpm.cfg.xml和jbpm.hibernate.cfg.xml,并且完成相关的配置
jbpm.hibernate.cfg.xml配置如下:
<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://localhost:3306/jbpm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 其他配置 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</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>
我们以mysql的数据库为例,在拷贝相关jar包的时候不能忘记mysql的数据库驱动程序。
三、我们需要编写流程定义文件,也就是jpdl文件:
JPDL(JBossjBPM Process Definition Language)是构建于jBPM框架上的流程语言之一。在jPDL中提供了任务(tasks)、待处理状态(waitstates)、计时器(timers)、自动处理(automated actions)….等术语,并通过图形化的流程定义,很直观地描述业务流程。
test.jpdl.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<process key="test" name="test" xmlns="http://jbpm.org/4.4/jpdl">
<start g="303,29,48,48" name="start1">
<transition g="-52,-22" name="提交到科长" to="科长审批"/>
</start>
<task assignee="张三" g="279,148,92,52" name="科长审批">
<transition g="-52,-22" name="提交到主任" to="主任审批"/>
</task>
<task assignee="李四" g="281,256,92,52" name="主任审批">
<transition g="-50,-22" name="通过" to="end1"/>
</task>
<end g="305,359,48,48" name="end1"/>
</process>
每一个jpdl文件都有一个key值,我们就是根据这个key值来创建流程实例。
四、我们做进一步的抽象,将一些公共的方法抽象出来成为一个抽象类,用于继承。
每一个工作流程都需要开启流程服务和拿到流程对象引擎。
package com.tgb.video;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.IdentityService;
import org.jbpm.api.ManagementService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import junit.framework.TestCase;
public class JbpmTestCase extends TestCase {
protected RepositoryService repositoryService;//部署流程服务
protected ExecutionService executionService;//流程执行服务
protected TaskService taskService;//任务服务
protected HistoryService historyService;//历史服务
protected ManagementService managementService;//流程管理服务
protected IdentityService identityService;//身份认证服务
protected void startUp(){
//拿到ProcessEngine流程对象引擎
ProcessEngine processEngine=Configuration.getProcessEngine();
//开启所有的服务
repositoryService=processEngine.getRepositoryService();
executionService=processEngine.getExecutionService();
taskService=processEngine.getTaskService();
historyService=processEngine.getHistoryService();
managementService=processEngine.getManagementService();
identityService=processEngine.getIdentityService();
}
public void print(String name ,String value){
System.out.print(name+"======="+value);
}
}
每一个流程都需要流程部署,创建流程实例,获取当前节点,获取任务和结束任务。所以我们也把这部分的操作抽象出来:
package com.tgb.video;
public interface JbpmUtil {
public void deploy();//部署流程
public void createInstance();//创建流程实例
public void getCurrectActivity();//获取流程当前节点
public void getTask();//获取任务
public void completeTask();//完成任务
}
部署、流程实现:
1、部署流程:
public void deploy(){
//拿到ProcessEngine流程对象引擎
ProcessEngine processEngine=Configuration.getProcessEngine();
//拿到RepositoryService服务
RepositoryService repositoryService=processEngine.getRepositoryService();
//通过xml文件部署
repositoryService.createDeployment().addResourceFromClasspath("test.jpdl.xml").deploy();
}
2、创建流程实例:
public void createInstance(){
ProcessEngine processEngine=Configuration.getProcessEngine();
ExecutionService executionService=processEngine.getExecutionService();
ProcessInstance processInstance=(ProcessInstance) executionService.startProcessInstanceByKey("test");
System.out.println("流程实例ID==========="+processInstance.getId());
}
3、获取对应人员的任务:
public void getTask(){
ProcessEngine processEngine=Configuration.getProcessEngine();
//拿去任务的服务接口
TaskService taskService=processEngine.getTaskService();
List<Task> tasks=taskService.findPersonalTasks("李四");
System.out.println("任务数量=="+tasks.size());
Task task=tasks.get(0);
System.out.println("任务名称=="+task.getActivityName());
System.out.println("任务人员=="+task.getAssignee()+"任务ID=="+task.getId());
}
4、查看流程实例当前对应的节点:
public void getCurrectActivity(){
ProcessEngine processEngine=Configuration.getProcessEngine();
ExecutionService executionService=processEngine.getExecutionService();
String activityName=executionService.createProcessInstanceQuery().processInstanceId("test.10001").uniqueResult().findActiveActivityNames().toString();
System.out.println("当前任务所在及节点=="+activityName);
}
5、完成任务:
public void complateTask(){
ProcessEngine processEngine=Configuration.getProcessEngine();
TaskService taskService=processEngine.getTaskService();
taskService.completeTask("20001");
}
整个流程就是这样,流程开始先要部署,然后创建流程实例获得流程实例的ID,然后根据ID查看当前流程所在节点,然后根据人员信息查看当前人员的任务,根据任务ID来结束任务。
下篇博客我们分析JBPM的几个服务。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11810.html