JBPM4 学习笔记 转
关于JBPM工作流
- 2. JBPM
jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统。JBPM使用Hibernate进行数据库操作,也就是说只要Hibernate支持的数据库它都可以使用,数据库主要是存放流程的定义,流程实例的信息,还有用户的信息等。
Jbpm工作流适用于:
n 项目流程比较多,流程复杂的项目。
n 系统运行和维护、升级时,流程可能需要修改、调整和跟踪、控制的项目。
全称是jBoss jPBM Process Definition Language,这种一种构建于jBPM架构之上的流程语言之一。jPDL提供了图形化处理的界面,跟VB语言差不多,拖拖拽拽就能做出个东西来,非常直观。这里面提供了很多图形化节点:
start和end节点在每个jBPM项目中都会用到,分别为开始节点和结束节点;
- //如果是读取默认的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();
- 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("---------------");
- }
- 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);
- 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("-----------------");
- 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());
- 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);
- 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());
- }
- 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");
- <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");
- <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);
- }
- }
- <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>
- <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");
- }
- }
JBPM4 学习笔记 转的更多相关文章
- 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 ...
随机推荐
- Java类加载器和双亲委派机制
前言 之前详细介绍了Java类的整个加载过程(类加载机制详解).虽然,篇幅较长,但是也不要被内容吓到了,其实每个阶段都可以用一句话来概括. 1)加载:查找并加载类的二进制字节流数据. 2)验证:保证被 ...
- PAT_B1002数字分类
#include<stdio.h> #include<iostream> using namespace std; int main(){ ,a2=,a3=,a5=; ; ; ...
- vs 中明明包含了头文件所在路径,但是却找不到头文件
vs基本不会出错,那么出错的只能是自己了. 哎,又被自己给蠢死了. 你可能在上面两个地方添加好了include 目录,但是却依然编译失败,失败的提示是找不到头文件所在路径,这是为什么呢. 很简单,因为 ...
- Hanoi塔问题——递归
/////////////Hanoi塔问题///////#include<iostream>using namespace std;void hanoi(int i,char A,char ...
- Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作
前言 前段时间写了EF core实现多租户的文章,实现了根据数据库,数据表进行多租户数据隔离. 今天开始写按照Schema分离的文章. 其实还有一种,是通过在数据表内添加一个字段做多租户的,但是这种模 ...
- lwip stats
lwip统计量分两种,一种是lwip自己的,一种是snmp的. 直接用snmp的 /* ----------------------------------- ---------- Statistic ...
- H5异步加载多图
异步加载多图(可能没啥用,加载慢)(图片预加载,提前给浏览器缓存图片) 1. 用一个计数变量记录需要加载的图片个数 2. 用new Image()去加载,加载完给此对象的src赋值要加载的url路径( ...
- CentOS7.x以上版本配置DNS失效解决办法
这2周做实验,centos7.x经常出现yum安装软件包的时候找不到解析地址,提示如下错误 正在尝试其它镜像. Error downloading packages: pam-devel-1.1.8- ...
- 杭电-------2044一只小蜜蜂(C语言写)
#include<stdio.h> ] = { }; long long divide(int n) { ) { ; } ) { return a[n]; } ) + divide(n - ...
- Ajax0001:ajax介绍 JSON数据处理