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 ...
随机推荐
- 网站部署,网站要求需要支持mb_substring
如果没有这个函数,php可能会出现中文乱码,处理方法如下: # yum install php-mbstring //安装 之后在/etc/php.ini中添加extension=mbstring ...
- 在 Visual Studio中 使用Apache Cordova 开发安卓、iOS程序(自定义图标和闪屏)
方法1 1台安装有linux的电脑,虚拟机也行,并安装imagemagick软件包.我用的是linux mint,直接在软件管理器中安装即可 把https://github.com/shamork/c ...
- webdriver常用函数总结
#1 创建浏览器对象 driver = webdriver.Chrome() #2 设置隐式等待10秒 driver.implicitly_wait(10) #3 最大化浏览器窗口 driver.ma ...
- 如何通过eclipse查看、阅读hadoop2.4源码
问题导读:1.官网src包下载包,能否直接使用?2.如何跟踪和查看hadoop源码? 此篇是从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码基础上的一个继续,上文其 ...
- fpga配置过程(转载)
fpga 配置时序图如下 1.FPGA器件有三类配置下载方式:主动配置方式(AS)和被动配置方式(PS)和最常用的(JTAG)配置方式. AS 由FPGA器件引导配置操作过程, ...
- 【java基础】java中String的注意点
[java的内存模型] 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存(Hea ...
- LG3953 逛公园
题意 策策同学特别喜欢逛公园.公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...
- Linux 根文件系统目录结构
/:根目录 /bin:linux的常用命令 /sbin:linux的常用命令 /lib:库文件(so.elf) /etc:系统配置文件和脚本文件 /sys:驱动相关的信息 /dev:设备节点目录 /p ...
- 如何用TortoiseSVN管理本地文档
1.安装(略) 2.搭建本地SVN版本管理数据库(服务器) (1)在本地磁盘上新建一个目录,例如E:\SVN,用来存储各种需要进行版本管理的文档:接着在该目录下再创建一个新的空目录,例如创建一个E:\ ...
- laravel的blade模板的布局嵌套
测试路由 Route::get('/', function() { $value = [,,]; return view('home.index', array('data' => $value ...