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