一、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工作流(一)——实现一个简单的工作流例子的更多相关文章

  1. 一个简单的CORBA例子

    因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...

  2. 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下   我们先来实现一个简单的例子,hello world ...

  3. 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)

    使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...

  4. 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...

  5. 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...

  6. 一个简单的cmake例子

    一个简单的cmake例子CMakeLists.txt,生成动态库文件,可以指定发布目录. 尚不支持: 1.交叉编译环境配置 2.添加依赖库   #在当前目录新建一个build目录,然后cd build ...

  7. 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子

    1. 一个简单的Quartz 工程     本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...

  8. Java学习笔记 11/15:一个简单的JAVA例子

    首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java   // TestJava.java,java 的简单范例  public ...

  9. 一个简单的springmvc例子 入门(1)

    一直是从事棋牌游戏,平常用的东西 大多数只是使用一些javase的一些 api对spring 这方面 用到的比较少,每次学了都忘,始终记不住.为了 更轻松学习springboot,从新学习了sprin ...

  10. 一个简单的SignalR例子

    本文介绍如何使用SignalR的Hub制作一个简单的点赞页面.不同浏览器(或者不同窗口)打开同一个页面,在任何一个页面点赞,所有页面同时更新点赞数. 1.使用Visual Studio Communi ...

随机推荐

  1. Android: Avoid passing null as the view root

    在做一个应用时把Android SDK从4.4换成6.0,使用LayoutInflater的inflate方法时出现以下情 LayoutInflater.inflate(int resource, V ...

  2. 微信内置浏览器submit函数无效的问题

    在表单提交button被点击时.触发提交函数,代码例如以下: <form id="frm_photo" enctype="multipart/form-data&q ...

  3. Tomcat connectionTimeout问题定位处理

    问题现象 在某个时刻,后端收到了平时4-6倍的请求(保密起见,略去产品和事件),在10分钟后居然没有请求可以接进来 问题原因 经过分析,首先,是后端服务器的线程池满了,线程池满的原因:1.server ...

  4. 解决CEF中显示Flash动画弹出安全警告问题

    一. 1.Xilium.CefGlue. CefApp (CefApp.cs文件)类on_before_command_line_processing方法内设置flash路径.版本号等. m_comm ...

  5. 设置GRUB密码以防止单用户模式下root密码被恶意更改

    在使用LInux系统的时候可能会发生忘记root密码的情况,通常管理员会进入单用户模式下进行重置root密码.那么问题来了,既然管理员可以进入单用户模式,如果恶意用户可以接触的到计算机的话毫无疑问也是 ...

  6. zookeeper做集群后启动不了,大部分原因是防火墙未关闭

    zookeeper做单机版,可以正常启动:但是zookeeper做集群后启动不了,大部分原因是防火墙未关闭. centos的关闭防火墙方法比较独立. systemctl stop firewalld. ...

  7. Linux常用指令笔记

    目标:统计当前目录下java文件的个数 指令:`ls -R ./ | grep .java$ | wc -l` 原理:`ls -R ./`列出当前文件夹下的所有FILE,包括目录以及文件;`grep ...

  8. Redux 入门到高级教程

    Redux 是 JavaScript 状态容器,提供可预测化的状态管理. (如果你需要一个 WordPress 框架,请查看 Redux Framework.) Redux 除了和 React 一起用 ...

  9. 巴塞罗那VS皇家马德里

    刚刚看完巴萨VS皇马的比赛,跌宕起伏,悬念保持到了最后一分钟的最后一回合 ---- 梅西绝杀. 工作之后,很少看比赛了.一直觉得梅西.C罗双子星的时代正在接近尾声,自己要尽量看一场少一场,免得到时后悔 ...

  10. 利用TortoiseGit(小乌龟)将项目上传至GitHub网站

    准备 1.拥有一个GitHub账户 2.安装了TortoiseGit(小乌龟) 具体过程 一.在GitHub上建立新的仓库 起好仓库名,填好描述,在Add .gitgnore中选择Java(根据你自己 ...