JBPM工作流(一)——实现一个简单的工作流例子
一、JBPM定义
JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。
二、为什么用JBPM
业务分析师和开发人员使用的是同一种语言来交谈,大大降低了开发的风险,如果要开发一个项目,速度也更快了,因为开发人员不用再将用户需求转化成软件设计了。其次,JBPM采用的不是一般的开发工具,而是自己的图形化开发工具,非常方便随时了解和掌握运行的进程。最后,JBPM的流程框架非常灵活,使用起来也非常安全,它经过了安全认证,因此可以保证一些商业机密不被泄露。
三、JBPM环境配置详解
首先在Eclipse中配置环境。如下:
① 配置GPD(流程设计器)
Help ------> Install New Software
点击add,出现一个Add Repository
点击Archive,选择jbbm4.4/install/src/gpd/jbpm-gpd-site.zip
② 选择所有插件,然后点Next即可
③ 配置JBPM运行时
1) 打开window --- preferences
1) 选择 JBoss jBPM --> Runtime Locations
2) 点击 Add...
3) 在 Add Location 对话框中,输入一个名字,比如 jbpm-4.4 然后点击 Search...
4) 在 Browse For Folder 对话框中,选择你的jbpm 根目录,然后点击 OK
④ 在目录中添加JPDL4模式
如果你想直接编辑XML 源码, 最好是在你的XML 目录中指定一下模式(schema),这样当你在编辑流程源码的时候,可以更好的帮助你编写代码。
1) 点击窗口 --> 属性(Windows --> Preferences)
2) 选择XML --> 目录(XML --> XML CataLog)
3) 点击添加(Add)
4) 添加XML 目录(Add XML Catalog Entry)的窗口打开
5) 点击map-icon 的图标下面的按钮并选择文件系统(File System)
6) 在打开的对话框中, 选择jBPM 安装目录下src 文件夹中jpdl.xsd 文件
7) 点击打开(Open)并且关闭所有的对话框
四、JBPM开发步骤详解
① 引入JAR文件
在jbpm4.4的解压包中根目录Jbpm的jar包还有lib文件夹中除report-engine,war包外所有jar包
注:因为Jbpm4.4是用Mysql作为DB的,如果要用Oracle作为DB需要引入相应的驱动包。
② 创建配置文件
③ 画流程图---[新建jpdl.xml文件]
并生成jbpmtest.jpdl.xml文件:
五、关键代码
① 创建表18张
[http://www.cnblogs.com/a757956132/p/4774188.html]表的详细说明
②获取工作流引擎
1
2
3
4
5
6
|
ProcessEngine processEngine= new Configuration().setResource( "jbpm.cfg.xml" ).buildProcessEngine(); @Test public void test01(){ System.out.println(processEngine); } |
③部署流程定义
1
2
3
4
5
6
7
8
9
|
@Test public void deploy(){ String deployid = processEngine.getRepositoryService() .createDeployment() .addResourceFromClasspath( "jbpmtest.jpdl.xml" ) .addResourceFromClasspath( "jbpmtest.png" ).deploy(); System.out.println( "部署流程 id:" +deployid); } |
④启动流程实例
1
2
3
4
5
6
7
|
@Test public void startTest(){ //启动流程实例 通过key,key是process节点中的key,如果不写,默认为name的值 ProcessInstance pi=processEngine.getExecutionService().startProcessInstanceByKey( "jbpmtest" ); System.out.println( "start ok!" ); System.out.println( "id:" +pi.getId()+ ",状态:" +pi.getState()+ ",流程定义的ID:" +pi.getProcessDefinitionId()); } |
⑤查看任务列表
1
2
3
4
5
6
7
8
9
10
|
@Test public void selectTask(){ String user= "张三" ; String users= "王五" ; List<Task> tasks = processEngine.getTaskService().findPersonalTasks(user); for (Task task : tasks) { System.out.println( "任务ID:" +task.getId()+ "\t任务名称:" +task.getName()+ "\t任务办理人:" +task.getAssignee()); } } |
⑥查看当前任务所在点
1
2
3
4
5
|
@Test public void findSelect(){ String name = processEngine.getExecutionService().createProcessInstanceQuery().processInstanceId( "jbpmtest.80001" ).uniqueResult().findActiveActivityNames().toString(); System.out.println(name); } |
⑦办理任务
1
2
3
4
5
|
@Test public void testCompleteTask(){ processEngine.getTaskService().completeTask( "10002" ); System.out.println( "OK" ); } |
六、流程管理
①查询所有流程定义
1
|
ProcessEngine pro=Configuration.getProcessEngine(); |
1
2
3
4
5
6
7
8
9
10
11
|
@Test public void findAll(){ List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().list(); for (ProcessDefinition pd : list) { System.out.println( "id:" +pd.getId()+ "\tname:" +pd.getName()+ "\tkey:" +pd.getKey()+ "\t版本号:" +pd.getVersion()+ "\t部署的id:" +pd.getDeploymentId()); } } |
②查询最新版的流程定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Test public void getNewFindAll(){ //查询所有,让最大的版本排到最后面 List<ProcessDefinition> all = pro.getRepositoryService().createProcessDefinitionQuery().orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION).list(); //过滤出所有最新的版本 Map<String, ProcessDefinition> map= new HashMap<String, ProcessDefinition>(); for (ProcessDefinition pd : all) { 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() // 流程定义的key,jpdl.xml中根元素的key属性的值,默认是name属性的值 + ", version=" + pd.getVersion() // 自动生成的,同一个名称的第一个为1,以后的自动加1. + ", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象 } } |
③根据id删除
注:deleteDeploymentCascade级联删除
1
2
3
4
5
|
@Test public void delById(){ pro.getRepositoryService().deleteDeploymentCascade( "1" ); System.out.println( "del ok!!!" ); } |
④删除指定key的所有版本的流程
1
2
3
4
5
6
7
8
|
@Test public void delByKey(){ List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey( "jbpmtest" ).list(); for (ProcessDefinition pd : list) { pro.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId()); } } |
⑤ZIP 部署
1
2
3
4
5
6
7
8
9
|
@Test public void addZip(){ //部署zip格式的资源 InputStream is= this .getClass().getClassLoader().getResourceAsStream( "src.zip" ); ZipInputStream zs= new ZipInputStream(is); String id= pro.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy(); System.out.println( "部署成功:deploymentid:" +id); } |
JBPM工作流(一)——实现一个简单的工作流例子的更多相关文章
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- 一个简单的cmake例子
一个简单的cmake例子CMakeLists.txt,生成动态库文件,可以指定发布目录. 尚不支持: 1.交叉编译环境配置 2.添加依赖库 #在当前目录新建一个build目录,然后cd build ...
- 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子
1. 一个简单的Quartz 工程 本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...
- Java学习笔记 11/15:一个简单的JAVA例子
首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java // TestJava.java,java 的简单范例 public ...
- 一个简单的springmvc例子 入门(1)
一直是从事棋牌游戏,平常用的东西 大多数只是使用一些javase的一些 api对spring 这方面 用到的比较少,每次学了都忘,始终记不住.为了 更轻松学习springboot,从新学习了sprin ...
- 一个简单的SignalR例子
本文介绍如何使用SignalR的Hub制作一个简单的点赞页面.不同浏览器(或者不同窗口)打开同一个页面,在任何一个页面点赞,所有页面同时更新点赞数. 1.使用Visual Studio Communi ...
随机推荐
- 让你的app在iPhoneX中全屏显示
如果你的项目什么也不修改,直接把你的app运行在 iPhone X 模拟器下,很有可能就会出现下面的情形: 上下都有黑边,没有全屏显示 为了让app能够全屏显示,你需要准备以下的内容 Xcode 9. ...
- ReactNative如何在JS中引用原生自定义控件(rn变化太快,网上很多教程有坑,这个我研究后可用,特意分享)
直接写一个Demo例子,有相关功底的肯定明白,会对特别的地方进行提醒,本文基于https://blog.csdn.net/lintcgirl/article/details/53489490,但是按此 ...
- SharePoint每日小贴士Web部件
SharePoint每日小贴士Web部件 项目描写叙述 此Web部件从指定SP自己定义列表或一个选定的 RSS源选择一个随机项目.并显示一张图片.标题和一个Tip. 适 ...
- Apache Kafka 快速入门
概述 Apache Kafka是一个分布式发布-订阅消息系统和强大的队列,可以处理大量的数据,将消息从一个端点传递到另一个端点.Kafka适合离线和在线消息消费,Kafka消息保存在磁盘上,并在集群内 ...
- 每天一个linux命令:iostat
1.命令简介 iostat(I/O statistics 输入/输出统计) 命令对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况 2.用法 iostat [ ...
- [C#] .NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题
作者: zyl910 一.缘由 项目规模大了后,经常会出现源码文件分布在不同目录的情况,但.NET Core项目默认只有项目目录下的源码文件,且不支持"Add As Link"方式 ...
- 使用 GeoIP2 获取 IP 的地理位置
1. 准备工作 数据库 : 解析 IP 地理位置的的数据库来自 GeoLite2 开源数据库:https://dev.maxmind.com/geoip/geoip2/geolite2/ . C 语言 ...
- Linux下逻辑地址、线性地址、物理地址详细总结
Linux下逻辑地址.线性地址.物理地址详细总结 一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址 ...
- CentOS 6.5 x64相关安全,优化配置
一.安全 1.修改密码长度: [root@CentOS64 ~]# vi /etc/login.defs PASS_MAX_DAYS 99999 //用户的密密码最长使用天数 PASS_MIN_D ...
- k8s dev
0. install golang 1.9.1 https://golang.org/doc/install 1. development.md https://github.com/kubernet ...