JBPM4.4学习笔记
1、JBPM4表说明:
JBPM4_DEPLOYMENT 流程定义表
JBPM4_DEPLOYPROP 流程定义属性表
JBPM4_EXECUTION 流程实例表
JBPM4_HIST_ACTINST 流程活动( 节点) 实例表
JBPM4_HIST_DETAIL 流程历史详细表
JBPM4_HIST_PROCINST 流程实例历史表
JBPM4_HIST_TASK 流程任务实例历史表
JBPM4_HIST_VAR 流程变量( 上下文) 历史表
JBPM4_ID_GROUP 组表
JBPM4_ID_MEMBERSHIP 用户角色表
JBPM4_ID_USER 用户表
JBPM4_JOB 定时表
JBPM4_LOB 存储表 存放流程定义的xml和png图片文件
JBPM4_PARTICIPATION 参与者表
JBPM4_SWIMLANE 泳道表
JBPM4_TASK 任务表
JBPM4_VARIABLE 上下文表
2、工作流的基本思路:
3、jBPM有什么,简介jBPM的Service API
4、jPDL基础--1
5、流程操作1、如何发布流程
//如果是读取默认的jbpm.cfg.xml文件
ProcessEngine engine = Configuration.getProcessEngine();
//如果不是读取默认的jbpm.cfg.xml文件
ProcessEngine engine = new Configuration()
.setResource("ccjbpm.cfg.xml")
.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addResourceFromClasspath("cn/javass/jbpm4/hello/hello.jpdl.xml")
.deploy();
2、如何检索流程定义
ProcessEngine processEngine = Configuration.getProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
List<ProcessDefinition> pdList = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd:pdList){
System.out.println("id:"+pd.getId());
System.out.println("name:"+pd.getName());
System.out.println("version:"+pd.getVersion());
System.out.println("deploymentId:"+pd.getDeploymentId());
System.out.println("---------------");
}
3、如何启动一个实例
ProcessEngine processEngine = Configuration.getProcessEngine();
ExecutionService executionService = processEngine.getExecutionService();
Map map = new HashMap();
map.put("pm","ProjectManager");
map.put("dm", "DepartmentManager ");
map.put("ceo", "Manager");
executionService.startProcessInstanceByKey("MyProcess",map);
4、如何检索流程实例
ProcessEngine processEngine = Configuration.getProcessEngine();
ExecutionService executionService = processEngine.getExecutionService();
List<ProcessInstance> piList = executionService.createProcessInstanceQuery().list();
for (ProcessInstance pi : piList) {
System.out.println("id:"+pi.getId());
System.out.println("activeActivityNames:“+pi.findActiveActivityNames());
System.out.println("state:"+pi.getState());
System.out.println("-----------------");
5、如何检索出Task
ProcessEngine processEngine = Configuration.getProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().list();
for(Task t : list){
System.out.println("activityName="+t.getActivityName()+",user="
+t.getAssignee()+",id="+t.getId());
6、如何完成task
ProcessEngine processEngine = Configuration.getProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId = “70003”;//这个是流程运行中生成的任务id Map map = new HashMap();
map.put("dmResult", 1);
map.put("days", 15); taskService.completeTask(taskId,map);
7、如何检索出历史的流程实例
ProcessEngine engine = Configuration.getProcessEngine();
HistoryService hs = engine.getHistoryService();
List<HistoryProcessInstance> list = hs.createHistoryProcessInstanceQuery().list(); for(HistoryProcessInstance hpi : list){
System.out.println("state="+hpi.getState()+" ,pdid=“+hpi.getProcessDefinitionId()+
",piid="+hpi.getProcessInstanceId()+",startTime="+hpi.getStartTime());
}
6、流程的描述
ExecutionService exe = engine.getExecutionService(); Execution e = exe.createProcessInstanceQuery()
.processInstanceId(piid).uniqueResult()
.findActiveExecutionIn(“state活动名称"); exe.signalExecutionById(e.getId());
<decision name="evaluate document">
<handler class="org.jbpm.examples.decision.handler.ContentEvaluation" />
<transition name="good" to="submit document" />
<transition name="bad" to="try again" />
<transition name="ugly" to="give up" />
</decision>
public class ContentEvaluation implements DecisionHand
public String decide(OpenExecution execution) {
String content = (String) execution.getVariable("content");
if (content.equals("you're great")) {
return "good";
}
if (content.equals("you gotta improve")) {
return "bad";
}
return "ugly";
}
}
<decision>
<transition name="good" to="submit document" />
<transition name="bad" to="try again" />
<transition name="ugly" to="give up" />
</decision> Map<String, Object> variables = new HashMap<String, Object>();
variables.put("content", "good");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("DecisionExpression", variables);
<decision name="evaluate document">
<transition to="submit document">
<condition expr="#{content=="good"}" />
</transition>
<transition to="try again">
<condition expr="#{content=="not so good"}" />
</transition>
<transition to="give up" />
</decision> Map<String, Object> variables = new HashMap<String, Object>();
variables.put("content", "good");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("DecisionConditions", variables);
<task name="review" assignee="#{order.owner}" > 《或者assignee="johndoe"》
<transition to="wait" />
</task>
public class Order implements Serializable {
String owner;
public Order(String owner) {
this.owner = owner;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("order", new Order("johndoe"));
ProcessInstance processInstance = executionService
.startProcessInstanceByKey("TaskAssignee", variables);
List<Task> taskList = taskService.findPersonalTasks("johndoe");
};
TaskService taskService = processEngine.getTaskService();
taskService.takeTask(“task的id”, “领取task的人员");
<task name="review" candidate-groups="sales" >
<transition to="wait" />
</task>
IdentityService identityService = processEngine.getIdentityService();
identityService.createGroup("sales");
identityService.createUser(“zhang", “zhang", “san");
identityService.createUser(“li", “li", “si");
identityService.createMembership(“zhang", "sales");
identityService.createMembership(“li", "sales");
taskService.findGroupTasks("zhang");
taskService.findGroupTasks("li");
注意:为了防止同一个任务被一个分组中的多个人领取,需要将这个任务分配给指定的个人后才能开始执行任务,例如下面taskService.takeTask(task.getDbid(), "zhang");并且任务呗某一个用户领取之后,应该将该任务标识为已领取状态,以避免造成重复。
<task name="review" g="96,16,127,52">
<assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask"> <field name="assignee">
<string value="johndoe" />
</field> </assignment-handler>
<transition to="wait" /> </task>
public class AssignTask implements AssignmentHandler{
private String name;
public String getName() {
return name;
}
public void setName(String name) { this.name = name; }
public void assign(Assignable assignable, OpenExecution execution)
throws Exception {
assignable.setAssignee(name);
}
}
注意:Please note that potentially, AssignmentHandler implementations can use the process variables and any other Java API to access resources like your application database to calculate the assignee and candidate users and groups.}
<java g="246,135,92,52" name="java1" class="cn.javass.test.java.MyJava"
method="sayHello" var="manager"> <field name="user1"><object expr="#{user1}"/></field> <field name="user2"><string value="user2"/></field> <arg><string value="xyz"/></arg> <arg><object expr="#{abc}"/></arg> <transition to="task1"/> </java>
public class MyJava{
private String user1;
private String user2;
…user1和user2的setter
public String sayHello(String arg1,String arg2){
System.out.println("user1=="+user1);
System.out.println("user2=="+user2);
System.out.println("arg1=="+arg1);
System.out.println("arg2=="+arg2);
return “Hello";
}
}
<sql g="192,438,92,52" name="sql1" unique="true" var="sqlV">
<query>
select * from tbl_user where uuid=:uuid
</query> <parameters>
<object name="uuid" expr="#{uuid}"></object>
</parameters> <transition to="hql1"/>
</sql>
<hql name="hql1" g="404,457,92,52" unique="true" var="hqlV">
<query>
select o from Parent o where o.id=:id
</query> <parameters>
<string name="id" value="22"/>
</parameters> <transition to="task2"/>
</hql>
<foreach name="foreach1" in="D1,D2,D3" var="nowDep">
<transition to="task5"/>
</foreach> <task name="task5">
<transition to="join1"/>
</task> <join name="join1" multiplicity="3">
<transition to="task6"/>
</join>
与join活动连用通常情况下,foreach活动后面是多次执行的活动,在这个活动后面应该跟一个join活动,并且把join活动的multiplicity设置成为foreach的数量,这样才会等到foreach的多个task执行完成,流程才继续向下,否则,只要有一个foreach的task完成了,流程就向下流转了。
<on event="start"> <event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="start on process definition"/></field>
</event-listener>
</on> <start>
<transition to="wait"/>
</start> <state name="wait">
<on event="start">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="start on activity wait"/></field>
</event-listener>
</on> <on event="end">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="end on activity wait"/></field>
</event-listener>
</on> <transition to="park">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
<field name="msg"><string value="take transition"/></field>
</event-listener>
</transition> </state>public class MyEventListener implements EventListener{ public void notify(EventListenerExecution exection) throws Exception { System.out.println("走出Decistion"); }
}
7、tomcat的配置:
JBPM4.4学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- onenote的笔记本在windows10保存的路径
onenote挺好用的,支持windows,android,mac等操作系统,完全符合我的需求,并且还没有广告.但是,在删除笔记本的时候,感觉比较费事,因为他没有配置告诉我们文件具体放在哪个路径下了, ...
- WordCount运行详解
1.MapReduce理论简介 1.1 MapReduce编程模型 MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然 ...
- MAMP环境配置
命令行: 开启apache服务:sudo apachectl start 停止apache服务:sudo apachectl stop 重启服务:sudo apachectl restart 查看版本 ...
- LeetCode 529. Minesweeper
原题链接在这里:https://leetcode.com/problems/minesweeper/description/ 题目: Let's play the minesweeper game ( ...
- LeetCode Best Time to Buy and Sell Stock with Transaction Fee
原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/descripti ...
- 微信开发 api 需要 https 服务器
微信开发 api 需要 https 服务器 先建一个环境,本地的 https 服务器. 以下这篇不错,很完整. https://zhuanlan.zhihu.com/p/23640321
- [LeetCode系列]BST有效性确定问题[前序遍历]
给定一个BST的根节点, 试判断此BST是否为符合规则的BST? 规则: 对于一个BST的节点, 它左侧的所有节点(包括子节点)必须小于它本身; 它右侧的所有节点(包括子节点)必须大于它本身; 它的左 ...
- SpringMVC-Spring-Hibernate项目搭建之三-- freemarker & 静态资源整合
一. 前段目录结构如下架构如下: 二. freemarker文件配置 在 web.xml 文件中指定 spring 配置文件的位置 三. 配置springmvc-servlet.xml文件 1)配置自 ...
- java多线程(2) 线程同步
我们对线程访问同一份资源的多个线程之间,来进行协调的这个东西,就是线程同步. 例子1:模拟了多个线程操作同一份资源,可能带来的问题: package com.cy.thread; public c ...
- Java 成员变量和局部变量
1.成员变量 在类中定义,用来描述对象将要有什么. 2.局部变量 在类的方法中定义,在方法中临时保存数据. 成员变量和局部变量的区别 作用域不同: 局部变量的作用域仅限于定义它的方法 成员变量的作用域 ...