大家好,又见面了,我是你们的朋友全栈君。
一、JBPM(java business process manager)
1、工作流管理流程
O—>定义工作流(使用流程设计器生成,png和xml文件,分别面向用户和系统)
—>执行工作流(核心对象:流程引擎ProcessEngine)
—>连接数据库(jbpm18张表,jbpm4_deploymen,jbpm4_deployprop,jbpm4_execution,jbpm4_hist_task,jbpm_hist_var,jbpm4_lob,jbpm4_task,jbpm_variable)
2、jbmp中的几个基本概念
流程引擎,ProcessEnginee
*RepositoryService
*ExcutionService
*TaskService
部署对象(deployment):一次部署一个或者多个文件到数据库中(png,xml,zip)
流程定义(processDefinition):获得并解析xml,解析xml文件中的内容,内容即流程定义的规则,工作流jbpm就是按照流程定义的规则往下执行的。与流程定义相关的表,
jbpm部署流程定义的表:select * from jbpm4_deployment;
jbpm流程定义的表:select * from jbpm4_deployprop;
存放资源文件的表:select * from jbpm4_lob;
执行对象(Execution):按照指定的流程定义执行一次的过程,就叫做执行对象;
相关的数据库表:
存放jbpm正在执行的流程实例信息表:select * from jbpm4_execution;
存放jbpm执行信息流失表:select * from jbpm4_hist_procinst;
流程实例(ProcessInstance):从业务的开始到结束之间最大的执行对象就是流程实例,当业务流程中只有一个分支(路线)的时候,此时的执行对象就是流程实例。
流程变量:使用流程变量存储数据,在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。
活动环节:
任务(Task)
当前活动节点是任务的时候,那么此时执行的就是任务
相关的数据库表:
存放正在执行的任务信息表:select * from jbpm4_task;
存放任务信息历史表:select * from jbpm4_hist_task;
状态(state)
当前活动节点是状态的时候,那么此时就是状态节点,是当前流程在状态节点中先停 留一下。
流程连线
1、一个活动中可以指定一个或多个Transition(Start中只能有一个,End中没有)
2、结束活动中没有Transition
3、开始活动中只有一个Transition
4、其他活动中有1条或多条Trasition
5、如果只有一个,则可以不指定名称(名称是null);如果有多个,则要分别指定唯一的名称。
2、jbpm的实现步骤和细节
四个步骤:
1、部署流程定义(xml和png)
2、启动流程实例
3、查看我的个人任务
4、办理任务
流程引擎的创建:
第一种:使用默认的配置文件(jbpm.cfg.xml)生成Configuration并构建ProcessEngine:
ProcessEngine processEngine= newConfiguration().buildProcessEngine();
第二种:使用指定的配置文件(要放到classPath下):
ProcessEngine processEngine= newConfiguration()
.setResource(“my-own-configuration-file.xml”)
.buildProcessEngine();
第三种:使用如下代码获取使用默认配置文件的、单例的ProcessEngine对象:
ProcessEngine processEngine= Configuration.getProcessEngine();
流程定义:
1、部署流程定义
流程定义通过流程设计器设计出两个对应的png图片格式和xml配置文件的格式。
//部署
@Testpublic void testDeploy() throwsException {
String deploymentId= processEngine.getRepositoryService()//.createDeployment()//.addResourceFromClasspath(“helloworld/helloworld.jpdl.xml”)//.addResourceFromClasspath(“helloworld/helloworld.png”)//.deploy();
System.out.println(“deploymentId=” deploymentId);
}//部署
@Testpublic void testDeploy_zip() throwsException {
InputStream in=getClass().getClassLoader().getResourceAsStream(“helloworld/helloworld.zip”);
ZipInputStream zipInputStream= newZipInputStream(in);
String deploymentId= processEngine.getRepositoryService()//.createDeployment()//.addResourcesFromZipInputStream(zipInputStream)//.deploy();
System.out.println(“deploymentId=” deploymentId);
2、流程定义的查询
@Testpublic void testFindAll() throwsException {//查询
List list = processEngine.getRepositoryService()//.createProcessDefinitionQuery()//
//过滤条件//.processDefinitionId(“helloworld-1”)//.processDefinitionKey(“helloworld”)//
//排序//.orderAsc(ProcessDefinitionQuery.PROPERTY_ID)//
//.orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION)//
//执行查询//.uniqueResult();//.count();//.page(firstResult, maxResults)//.list();//显示
for(ProcessDefinition pd : list) {
System.out.println(“id=” pd.getId()//格式:{key}-{version}
“, name=” pd.getName()//.jpdl.xml根元素的name属性的值
“, key=” pd.getKey()//.jpdl.xml根元素的key属性的值,如果不写,默认为name属性的值
“, version=” pd.getVersion()//默认自动维护,第1个是1,以后相同key的都会自动加1
“, deploymentId=” pd.getDeploymentId()); //所属的某个Deployment的对象
}
}
3、删除流程定义
//删除(使用流程定义ID)
@Testpublic void testDeleteById() throwsException {
String deploymentId= “90001”;//删除某部署对象(也可以称之为删除流程流程定义),如果有关联的执行信息,就报错//processEngine.getRepositoryService().deleteDeployment(deploymentId);//删除某部署对象(也可以称之为删除流程流程定义),如果有关联的执行信息,就级联删除
processEngine.getRepositoryService().deleteDeploymentCascade(
deploymentId);
}
4、查看流程图
//查看流程图(xxx.png)
@Testpublic void testShowProcessImage() throwsException {//获取文件内容
String deploymentId = “1”;
String resourceName= “helloworld/helloworld.png”;
InputStream in= processEngine.getRepositoryService()//.getResourceAsStream(deploymentId, resourceName);//保存到c:/
FileOutputStream out = new FileOutputStream(“c:/process.png”);for (int b = -1; (b = in.read()) != -1;) {
out.write(b);
}
in.close();
out.close();
}
5、查询最新版本的流程定义
@Testpublic void testFindAllLatestVersions() throwsException {//查询,把最大的版本都排到后面
List list = processEngine.getRepositoryService()//.createProcessDefinitionQuery()//.orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//.list();//过滤出最新的版本
Map map = new LinkedHashMap();for(ProcessDefinition pd : list) {
map.put(pd.getKey(), pd);
}//显示
for(ProcessDefinition pd : map.values()) {
System.out.println(“id=” pd.getId()//格式:{key}-{version}
“, name=” pd.getName()//.jpdl.xml根元素的name属性的值
“, key=” pd.getKey()//.jpdl.xml根元素的key属性的值,如果不写,默认为name属性的值
“, version=” pd.getVersion()//默认自动维护,第1个是1,以后相同key的都会自动加1
“, deploymentId” pd.getDeploymentId()); //所属的某个Deployment的对象
}
}
6、按照key删除所有版本的流程定义
//删除(使用流程定义的key)
@Testpublic void testDeleteByKey() throwsException {//1,查询指定key的所有版本的流程定义
List list = processEngine.getRepositoryService()//.createProcessDefinitionQuery()//.processDefinitionKey(“helloworld”)//.list();//2,循环删除
for(ProcessDefinition pd : list) {
processEngine.getRepositoryService()//.deleteDeploymentCascade(pd.getDeploymentId());
}
}
流程实例和任务
1、部署流程定义(xml和png)
2、启动流程实例
//启动流程实例
@Testpublic void testStartProcessInstance() throwsException {
ProcessInstance pi= processEngine.getExecutionService().startProcessInstanceByKey(“test”);
System.out.println(“流程实例启动成功,processInstanceId=” pi.getId());
}
3、查看我的任务列表
@Testpublic void testFindMyTaskList() throwsException {//查询
String userId = “部门经理”;//List list = processEngine.getTaskService().findPersonalTasks(userId);
List list = processEngine.getTaskService()//.createTaskQuery()//.assignee(userId)//要是指定的办理人//.count()//.page(firstResult, maxResults)
.list();//显示
for(Task task : list) {
System.out.println(“id=” task.getId()// “, name=” task.getName()//任务的名称
“, assignee=” task.getAssignee()//任务的办理人
“, createTime=” task.getCreateTime()//任务的创建时间
“, executionId=” task.getExecutionId()); //所属的执行对象的id
}
}
4、完成任务
//办理任务
@Testpublic void testCompleteTask() throwsException {
String taskId= “20002”;
processEngine.getTaskService().completeTask(taskId);
}
5、向后执行一步
//让流程向后执行一步
@Testpublic void testSignalExecution() throwsException {//String executionId = “helloworld.20001”;//String signalName = “to 审批 [总经理]”;
String executionId = “helloworld.20001”;
processEngine.getExecutionService().signalExecutionById(executionId,”to 审批 [总经理]”);
}
流程变量
1、在流程传递的过程中,可以为执行的对象或者任务来指定变量值,在流程执行、或者是任务执行的过程中,可以获取并设置对应的流程变量的值、
2、select * from jbmp4_variable
设置流程变量
//设置流程变量
@Testpublic void testSetVariable() throwsException {
String executionId= “test.80001”;
String name= “请假天数”;
Object value= new Integer(5);
processEngine.getExecutionService().setVariable(executionId, name, value);//Form form = new Form(1L, “张三请假11天”);//processEngine.getExecutionService().setVariable(executionId, “form”, form);
}
获取流程变量
//获取流程变量
@Testpublic void testGetVariable() throwsException {
String executionId= “test.80001”;
String name= “请假天数”;
Object value=processEngine.getExecutionService().getVariable(executionId, name);
System.out.println(name ” = ” value);//Form form = (Form) processEngine.getExecutionService().getVariable(executionId, “form”);//System.out.println(“id=” form.getId() “, title=” form.getTitle());
}
{//ExecutionService executionService = processEngine.getExecutionService();//TaskService taskService = processEngine.getTaskService();// //========================================// //设置变量的方法// //通过Execution设置一个变量//executionService.setVariable(executionId, name, value);// //通过Execution设置多个变量//executionService.setVariables(executionId, variablesMap);// //通过Task设置多个变量//taskService.setVariables(taskId, variablesMap);// //在启动流程实例时,同时也设置一些流程变量//executionService.startProcessInstanceByKey(processDefinitionKey, variablesMap);// //在完成任务时,同时也设置一些流程变量//taskService.completeTask(taskId, variablesMap);// //========================================// //获取变量的方法// //通过Execution获取一个变量//executionService.getVariable(executionId, variableName);// //通过Execution获取所有变量的名称集合//executionService.getVariableNames(executionId);// //通过Execution获取所有变量的信息//executionService.getVariables(executionId, variableNames);
}
流程连线和活动
1、判断decision
URL url = this.getClass().getResource(“test.jpdl.xml”);
String deploymentID= processEngine.getRepositoryService()//.createDeployment()//.addResourceFromUrl(url)//.deploy();
System.out.println(“部署流程定义成功!deploymentID” deploymentID);//Integer value = 300;
Integer value = 3000;
Map variables = new HashMap();
variables.put(“报销金额”, value);
ProcessInstance pi=processEngine.getExecutionService().startProcessInstanceByKey(“test”,variables);
System.out.println(“启动流程实例成功!id=” pi.getId());
Task task= processEngine.getTaskService()//.createTaskQuery()//.processInstanceId(pi.getId())//.uniqueResult();
System.out.println(“当前任务的ID=” task.getId());
System.out.println(“当前任务的名称=” task.getName());
processEngine.getTaskService().completeTask(task.getId());
System.out.println(“任务完成!”);
判断当前操作属于哪一个分支
@SuppressWarnings(“serial”)public classDecisionHandlerImpl implements DecisionHandler {//用来判断当前操作执行哪个分支
@OverridepublicString decide(OpenExecution execution) {int money = (Integer) execution.getVariable(“报销金额”);//让总经理审批一下
if(money>1000){return “to 总经理审批”;
}//让流程结束
return “to end1”;
}
}
2、活动的(fork/join)
@Testpublic voidtest(){
URL url= this.getClass().getResource(“test.jpdl.xml”);
String deploymentID= processEngine.getRepositoryService()//.createDeployment()//.addResourceFromUrl(url)//.deploy();
System.out.println(“部署流程定义成功!deploymentID” deploymentID);
ProcessInstance pi=processEngine.getExecutionService().startProcessInstanceByKey(“test”);
System.out.println(“启动流程实例成功!id=” pi.getId());
}
3、个人任务
@Testpublic voidtestCompleteTask(){//4,执行完第1个任务,并使用指定的Transition离开
String taskId = “200001”;
String transitionName1= “to end1”;
String transitionName2= “to 审批 [总经理]”;//办理完任务,使用指定名称的Transition离开//processEngine.getTaskService().completeTask(task.getId(), transitionName2);//processEngine.getTaskService().completeTask(taskId, transitionName2);
processEngine.getTaskService().completeTask(taskId);
System.out.println(“任务执行完毕!”);
}
4.组任务
组任务及三种分配方式:1:在.jpdl.xml中直接写 candidate-users=“小A,小B,小C,小D” 2:在.jpdl.xml中写 candidate-users =“#{userIds}”,变量的值要是String的。
使用流程变量指定办理人
Map variables = new HashMap();
variables.put(“userIDs”, “大大,小小,中中”);3,使用AssignmentHandler接口,使用类实现该接口,在类中定义://添加组任务的用户
assignable.addCandidateUser(“张无忌”);
assignable.addCandidateUser(“张三丰”);
组任务分配给个人任务:
processEngine.getTaskService().takeTask(taskId, userId);
个人任务分配给组任务:
processEngine.getTaskService().assignTask(taskId,null);
向组任务添加人员:
processEngine.getTaskService().addTaskParticipatingUser(taskId, userId, Participation.CANDIDATE);
组任务对应的表:
jbpm4_participation
事件
1:在根元素中,或在节点元素中,使用元素指定事件,其中event属性代表事件的类型(start和end表示开始和结束)。2:在中用子元素,指定处理的类,要求指定的类要实现EventListener接口3:事件类型:
(1):元素放在根元素()中,可以指定event为start或end,表示流程的开始与结束。
(2):元素放在节点元素中,可以指定event为start或end,表示节点的进入与离开
(3):在Start节点中只有end事件,在End节点中只有start事件。
(4):在元素中直接写,就是配置事件。(因为在这里只有一个事件,所以不用写on与类型)
(5):在元素中还可以配置assign事件,是在分配任务时触发的。
@SuppressWarnings(“serial”)public class EventListenerImpl implementsEventListener {
@Overridepublic void notify(EventListenerExecution execution) throwsException {
System.out.println(“触发了事件监听,当前活动为:” execution.getActivity());
}
}
3.jbpm的具体过程实现
//获取工作流文件
URL url = this.getClass().getResource(“test.jpd1.xml”);
//部署流程定义
Stirng deploymentID = processEngine.getRepositoryService()
.createDeployment()
.addRosourceFromUrl(url)
.deploy();
System.out.println(“部署ID:” deploymentID);
//启动流程实例
ProcessInstance pi = processEngine.getExecutionService()
.startProcessInstanceByKey(“test”);
System.out.prinln(“流程实例id” pi.getId());
//查询我的任务列表
Task task = processEngine.getTaskService()
.createTaskQuery()
.processInstanceId(pi.getId())
.uniqueResult();//按照流程实例查询只有一个任务的结果对象
System.out.println(“任务Id” task.getId());
System.out.println(“任务名称” task.getName());
System.out.println(“任务的办理人” task.getAssignee());
System.out.println(“任务办理时间” task.getCreateTime());
//指定连线完成任务
String outcome = “流程执行的下一步(to end1)”;
//完成任务
processEngine.getTaskService()
.completeTask(task.getId(),outcome);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/195410.html原文链接:https://javaforall.cn