java jbpm工作流_jbpm工作流

java jbpm工作流_jbpm工作流一、JBPM(javabusinessprocessmanager)1、工作流管理流程O—>定义工作流(使用流程设计器生成,png和xml文件,分别面向用户和系统)—>执行工作流(核心对象:流程引擎ProcessEngine)—>连接数据库(jbpm18张表,jbpm4_deploymen,jbpm4_deployprop,jbpm4_execution,jbp…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、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)

f2ba91b4681d5b2f56b79f525ab012ce.png  

83d3c1a6a7741dd887ca35f93369176e.png

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):从业务的开始到结束之间最大的执行对象就是流程实例,当业务流程中只有一个分支(路线)的时候,此时的执行对象就是流程实例。

a2439237f81e34ac48b71736719683af.png

流程变量:使用流程变量存储数据,在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。

活动环节:

任务(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

83cfd7c04e946a391cd77017b443c2f0.png

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)

598328142436a8214893bc23a5ea2277.png

@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、个人任务

02ca4483436a35720c98a6e17dbf120b.png

@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

事件

6fc90f85b39193d6cbd39af9d816c12d.png

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);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195410.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 股票软件c++源代码

    股票软件c++源代码源码的部分配套开发文档http://item.taobao.com/auction/item_detail-0db1-4c3ffde99155fe1747132008fd2ece42.htm

  • conda创建虚拟环境怎么删除(anaconda离线创建虚拟环境)

    在Anaconda中conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。所以对虚拟环境进行创建、删除等操作需要使用conda命令。conda本地环境常用操作#获取版本号conda–version或conda-V#检查更新当前condacondaupdateconda#查看当前存在哪些虚拟环境condaenvlist或con…

  • 雅典娜暴利烹饪系列(下)「建议收藏」

    雅典娜暴利烹饪系列(下)「建议收藏」”呀–呀–呀–“爬到冰箱上的纱织吓的花容失色,”快点把那些土鳖拿开啦—-“端着一盆螃蟹的迪马斯头上好几个”加号”:”你叫个什么劲呀!!!不是你要学煮螃蟹,叫我下河给你捞的吗?!!这是螃蟹!!!螃蟹!!!!”纱织眼睛里无辜的泪水在打转:”骗人!螃蟹明明是红色的~~~””那是煮熟的好不好!!!”迪马斯已经在昏倒的边缘,”快拿去!!!””不要呀~~~~好可怕呀~~~~~”玉手一挥,螃蟹

  • 安卓模拟器打开开发者模式(USB调试)的方法

    安卓模拟器打开开发者模式(USB调试)的方法第一步:进入设置第二步:找到“关于电脑”(或者是“关于手机”)第三步:连续点击版本号字样,会有提示‘继续点击xx秒即可进入开发者模式’第四步:重新进入设置,会看到‘开发者选项’第五步:进入开发者选项,打开“USB调试”…

  • java中main方法的运行

    java中main方法的运行转载自:https://blog.csdn.net/WGYH_3767/article/details/76933676(最近要把一个main方法启动的项目集入web项目里,参考了main方法的运行机制才解决。)学过java的都知道main方法是学习java的开始,也是程序的入口,不过你有多少个类或程序,线程,他们的入口方法都是main()。main方法是一个静态的…

  • GIMP 2.10教程「建议收藏」

    GIMP 2.10教程「建议收藏」更新一下(2020-12-27),有大神刚完成人工翻译,质量很好,地址在此:https://www.ycproject.cn/gimp/gimp.html下文可以忽略了GIMP_2.10中文教程(谷歌机翻)GIMP是全平台(桌面)下的Photoshop,专门处理图片的。先放原文地址:https://docs.gimp.org/2.10/zh_CN/(基于2.10.18版)GIMP中文教程太少了,搜了一大圈找到一个靠谱点全一点的,是@笨⼩璀在2014年基于2012年的2.8版翻译的,翻译

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号