概念:

ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程、报销流程、是一个规则。

ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程步骤的信息。没有更新操作,启动流程实例时是使用指定key的最新的版本。

1.部署流程定义

a)一次添加一个资源,相关文件在Classpath中

1
2
3
4
5
6
7
8
9
10
11
12
13
// 1,部署流程定义(添加)
    // jbpm4_deployment
    // jbpm4_deployprop
    // jbpm4_lob
    @Test
    public void deploy_1() {
        String deploymentId = processEngine.getRepositoryService()//
                .createDeployment()//创建一个部署对象,Deployment:一次部署的信息,含有多个文件
                .addResourceFromClasspath("helloworld/test.jpdl.xml")//往Deployment对象添加资源
                .addResourceFromClasspath("helloworld/test.png")//
                .deploy();//执行部署
        System.out.println("deploymentId = " + deploymentId);
    }

  b)一次添加多个资源,多个资源先打成zip包

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
    public void deploy_2() {
        // 找到zip文件
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("helloworld/helloworld.zip");
        ZipInputStream zipInputStream = new ZipInputStream(in);
 
        // 部署
        String deploymentId = processEngine.getRepositoryService()//
                .createDeployment()//
                .addResourcesFromZipInputStream(zipInputStream)//
                .deploy();
        System.out.println("deploymentId = " + deploymentId);
    }

  

c)说明

1, addResourceFromClasspath(resource); 可以调用多次以添加多个文件。文件重复添加也不会报错。

2, addResourceFromInputStream(resourceName, inputStream)添加一个文件(使用InputStream)

3, addResourcesFromZipInputStream(zipInputStream)添加多个文件,里面也可以有文件夹。

4, 以上方法可以在一起调用。

2.查询所有流程定义

a) 查询所有流程定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
    public void findAll() {
        // 查询
        List<ProcessDefinition> list = processEngine.getRepositoryService()//
                .createProcessDefinitionQuery()//
                .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//排序条件
                //.count()查询出总数量
                //.page(0, 100)分页,取出前100条记录
                .list();
 
        // 显示
        for (ProcessDefinition pd : list) {
            System.out.println("id=" + pd.getId()// 格式为:{key}-{version}
                    + ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值
                    + ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值
                    + ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)
                    + ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id
        }
    }

  b) 查询所有最新版本的流程定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Test
    public void findAllLatestVersions() {
        // 1,查询所有流程定义,按Version升序排列,这样所有最大的版本就都排到最后了
        List<ProcessDefinition> allList = processEngine.getRepositoryService()//
                .createProcessDefinitionQuery()//
                .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//
                // .processDefinitionName("test")//
                // .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//
                // .orderDesc(ProcessDefinitionQuery.PROPERTY_KEY)//
                // .uniqueResult()
                // .count()
                // .page(firstResult, maxResults)
                .list();
 
        // 2,过滤出所需的最新版本的流程定义
        Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
        for (ProcessDefinition pd : allList) {
            map.put(pd.getKey(), pd);//不同的key会保存最新的版本(上面已经按版本升序排列)
        }
 
        // 显示
        for (ProcessDefinition pd : map.values()) {
            System.out.println("id=" + pd.getId()// 格式为:{key}-{version}
                    + ", name=" + pd.getName()// 流程定义文件(.jpdl.xml)中根元素的name属性的值
                    + ", key=" + pd.getKey()// 流程定义文件(.jpdl.xml)中根元素的key属性的值,可以不写,不写就是name属性的值
                    + ", version=" + pd.getVersion()// 流程定义文件(.jpdl.xml)中根元素的version属性的值,可以不写,不写就会自增(key相同时,版本加1)
                    + ", deploymentId=" + pd.getDeploymentId()); // 本流程定义对应的 .jpdl.xml 文件所属的Deployment对象的id
        }
    }

  

3.删除流程定义(其实是删除Deployment)

  

  

   void deleteDeployment(java.lang.String deploymentId):删除一个部署如果过程定义没有运行执行。历史信息(如果有的话)是在数据库中。
   
   void deleteDeploymentCascade(java.lang.String deploymentId):删除部署,包含过程定义,相关流程实例和他们的历史信息

a) 删除某个Deployment

1
2
3
4
5
6
7
8
@Test
    public void deleteById() {
        String deploymentId = "1";
        // // 删除某Deployment,如果有关联的执行信息,就抛异常
        // processEngine.getRepositoryService().deleteDeployment(deploymentId);
        // 删除某Deployment,如果有关联的执行信息,就级联删除
        processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
    }

  b) 删除指定key的所有版本的流程定义

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
    public void deleteByKey() {
        // 1,查询出指定key的所有版本的流程定义
        List<ProcessDefinition> list = processEngine.getRepositoryService()//
                .createProcessDefinitionQuery()//
                .processDefinitionKey("helloworld")//
                .list();
 
        // 2,循环删除
        for (ProcessDefinition pd : list) {
            processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
        }
    }

  

4.获取部署时的某文件的资源(查看流程图)

a) 查看流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Test
    public void getResourceFromDeployment() throws Exception {
        String deploymentId = "50001";
        String resourceName = "helloworld/test.png"; // 指定的是 jbpm4_lob 表中的name_列的值
 
        // 获取某Deployment中所有文件资源的名称
        Set<String> names = processEngine.getRepositoryService().getResourceNames(deploymentId);
        for (String name : names) {
            System.out.println(name);
        }
 
        // 获取某Deployment中指定名称的资源
        InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
 
        // 保存到"c:/"中
        OutputStream out = new FileOutputStream("c:/process.png");
        for (int b = -1; (b = in.read()) != -1;) {
            out.write(b);
        }
        in.close();
        out.close();
    }

  5.获取流程图中某活动的坐标(不重要)

1
2
3
4
5
6
7
String processDefinitionId = "test-1"; // 流程定义的id
    String activityName = "start1"; // 活动的名称
    ActivityCoordinates c = processEngine.getRepositoryService().getActivityCoordinates(processDefinitionId, activityName);
    System.out.println("x=" + c.getX()
            + ",y=" + c.getY()
            + ",width=" + c.getWidth()
            + ",height=" + c.getHeight());

  

JBPM工作流(四)——管理流程定义的更多相关文章

  1. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...

  2. JBPM4.4_管理流程定义

    1. 管理流程定义 没有更新功能 1.1. 部署流程定义 注意区分Deployment与ProcessDefinition 1.1.1. 示例代码1:流程定义有关文件在classpath中 Strin ...

  3. 工作流学习——Activiti流程定义管理三步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...

  4. JBPM学习(三):管理流程定义

    概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程 ...

  5. jBPM学习之部署流程定义

    也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...

  6. JBPM表达业务流程(流程定义语言)

    业务流程包括三部分: 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity) 连线 Transition / 转移 (从一个Acti ...

  7. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  8. WF工作流与管理类应用系统工作流需求实现的一些误区

             如今实现各种应用系统大家都知道工作流是一个非常重要的环节,不同的业务系统的工作流需求是需要找相应的工作流产品去实现的,因为不同工作流产品的架构细节也许会成为某类需求实现的瓶颈. WF ...

  9. JBPM工作流(三)——ProcessEngine与Service API

    1.获取processEngine的方法: a) 方法一 private ProcessEngine processEngine = new Configuration().setResource(& ...

随机推荐

  1. 解析 ViewTreeObserver 源码(上)

    主要内容:ViewTreeObserver 是被用来注册监听视图树的观察者,在视图树发生全局改变时将收到通知.本文从 ViewTreeObserver 源码出发,带你剖析 ViewTreeObserv ...

  2. 配置带用户权限的docker registry v2

    v1版本的docker registry用nginx配置,v2版本的用nginx有些问题,客户端总是会请求到v1/下面去, 以下从 http://blog.csdn.net/felix_yujing/ ...

  3. DLLImport的用法C#

    它来调用WIN32的API或者调用一下C或C++编写的DLL.使用实例:将编译好的C++ DLL拷贝到BIN目录(DLLImport会从程序启动目录BIN开始查找相应名称的DLL,未找到则转至syst ...

  4. grid - 网格项目对齐方式(Box Alignment)

    CSS的Box Alignment Module补充了网格项目沿着网格行或列轴对齐方式. <view class="grid"> <view class='ite ...

  5. 数据库的范式,第一、二、三、四、五范式、BC范式

    数据库的规范化(上一篇博客有写到)的程度不同,便有了这么多种范式.数据库范式是数据库设计必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库,甚至设计出错误误的数据库.课本中的定义比较抽 ...

  6. M600 Pro 安装问题解决

    1.遥控器版本为1.2.10 提示版本已是最新版本,那么Lightbridge2 必须是1.1.60 不能是1.1.70 2.卸载机翼的时候,尽量用飞机带的那把工具 3.机翼安装 135 逆时针 cc ...

  7. SharePonit online 列表表单定制

    1)在O365管理中心,确保启用了站点脚本定制,否则,网站不允许将页面切换到编辑模式. 2)Ribbon上,列表->表单web部件->编辑窗体 如果没有Ribbon,则到列表高级设置,启用 ...

  8. Unity应用架构设计(3)——构建View和ViewModel的生命周期

    对于一个View而言,本质上是一个MonoBehaviour.它本身就具备生命周期这个概念,比如,Awake,Start,Update,OnDestory等.这些是非常好的方法,可以让开发者在各个阶段 ...

  9. Linux下终端录制工具-asciinema

    1. 官网 https://asciinema.org/ 2. 功能 录音 录制终端命令 上传到多种位置 3. 使用方法 sudo yum install asciinema # 安装 asciine ...

  10. 【转】WPF 与 WinForm 间的按键值(枚举)转换

    There is a function for that in System.Windows.Input.KeyInterop static class. Try:var inputKey = Key ...