流程引擎对象ProcessEngine是jBPM4所有的Service API之源。在jBPM4中各种服务相互依存,但所有的Service API都从ProcessEngine中获得,由此可见ProcessEngine是jBPM4工作流API的核心。ProcessEngine是由Configuration类构建的,即工作流引擎根据配置产生。ProcessEngine是线程安全的,因此他可以保存在静态变量中。

因此,我们可以把获取ProcessEngine的代码编写如下:

package com.springchang.jbpm01;

import org.jbpm.api.Configuration;
import org.jbpm.api.ProcessEngine;
import org.junit.Test;

public class MyTest01 {
    private static ProcessEngine processEngine; //直接将流程引擎写成静态变量

    //静态代码块,获取processEngine
    static {
        Configuration cfg = new Configuration();
        cfg.setResource("jbpm.cfg.xml");
        processEngine = cfg.buildProcessEngine();
    }

    // 1,部署流程定义文档
    @Test
    public void testDeployProcessDefinition() throws Exception {
        String deploymentId = processEngine.getRepositoryService() //调用processEngine提供的接口
                .createDeployment()
                .addResourceFromClasspath("com/springchang/jbpm01/HelloWorld.jpdl.xml") //加载HelloWorld.jpdl.xml文件
                .addResourceFromClasspath("com/springchang/jbpm01/HelloWorld.png")      //加载Helloworld.png图片
                .deploy(); //发布流程定义
        System.out.println(deploymentId);
    }

}

而本节的重点是调用jBPM4.4中给定的各种API,从流程的发起,部署,办理任务到历史任务查询等一系列的操作。首先,流程定义如图所示:

对应的jPDL:

<?xml version="1.0" encoding="UTF-8"?>

<process name="process" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="118,16,48,48" name="start1">
      <transition g="-66,-22" name="to state1" to="state1"/>
   </start>
   <!-- state活动是等待活动,需要收到一个外部的执行信号才能流转通过 -->
   <state g="96,96,92,52" name="state1">
      <transition g="-60,-22" name="to task1" to="task1"/>
   </state>
   <!-- task活动是等待活动,在这里被分配给用户Spring Chang办理,Spring Chang办理完成提交任务后才能流转通过 -->
   <task assignee="Spring Chang" g="96,180,92,52" name="task1">
      <transition g="-57,-22" name="to end1" to="end1"/>
   </task>
   <end g="118,264,48,48" name="end1"/>
</process>

使用jBPM Service API发起并完成上面名为process的流程定义。代码如下:

package com.springchang.jbpm01;

import static org.junit.Assert.*;

import org.jbpm.api.Configuration;
import org.jbpm.api.Execution;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.history.HistoryProcessInstance;
import org.jbpm.api.history.HistoryTask;
import org.jbpm.api.task.Task;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class ProcessTest {

    private ProcessEngine processEngine;

    private String deploymentId;

    @Before
    public void setUp() throws Exception {
        processEngine = Configuration.getProcessEngine();
        deploymentId = processEngine.getRepositoryService().createDeployment()
                     .addResourceFromClasspath("com/springchang/jbpm01/process.jpdl.xml")
                     .addResourceFromClasspath("com/springchang/jbpm01/process.png")
                     .deploy();
    }

    @After
    public void tearDown() throws Exception {
        processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
    }

    @Test
    public void test() {
        //使用执行任务,根据已经部署的名陈process,发起流程实例
        ProcessInstance processInstance = processEngine.getExecutionService().startProcessInstanceByKey("process");
        //获取流程实例id
        String pid = processInstance.getId();
        System.out.println("pid:" + pid);
        //获取当前活动的执行对象
        Execution executionInState = processInstance.findActiveExecutionIn("state1");
        //断言当前活动是state1
        assertNotNull(executionInState);
        //使用执行服务:发出执行信号结束当前活动,继续流程的执行
        String executionId = executionInState.getId();
        System.out.println("executionId:" + executionId);
        processEngine.getExecutionService().signalExecutionById(executionId);
        //使用执行服务:从持久化层中获取“最新”的流程实例对象
        processInstance = processEngine.getExecutionService().findProcessInstanceById(pid);
        //获取当前活动的执行对象
        Execution executionInTask = processInstance.findActiveExecutionIn("task1");
        //断言当前活动即为task
        assertNotNull(executionInTask);
        //使用任务服务:获取用户Spring Chang的任务,即task活动产生的任务
        Task task = processEngine.getTaskService().findPersonalTasks("Spring Chang").get(0);
        assertEquals("Spring Chang", task.getAssignee());
        //使用任务服务,完成任务
        processEngine.getTaskService().completeTask(task.getId());
        //使用历史服务:创建历史任务查询
        HistoryTask historyTask = processEngine.getHistoryService().createHistoryTaskQuery()
                                  .taskId(task.getId()).uniqueResult();
        //断言上一步完成的任务已经成为历史,即可通过历史任务查询获取到它
        assertNotNull(historyTask);
        //断言该流程已经结束
        //assertProcessInstanceEnded(pid);
        //使用历史服务:创建历史流程实例查询
        HistoryProcessInstance historyProcessInst = processEngine.getHistoryService()
                                                    .createHistoryProcessInstanceQuery()
                                                    .processInstanceId(pid)
                                                    .uniqueResult();
        //断言该流程已经成为历史,即可通过历史流程实例查询获取它
        assertNotNull(historyProcessInst);
    }
}

上诉单元测试的代码setUp方法是部署流程定义,并调用addResourceFromClasspath方法加载流程实例文档来部署流程定义。tearDown方法作用是删除刚才部署的流程定义,并将与其相关的关联表的内容一并清空,主要的代码放在test测试方法里面。

jBPM学习之利用API完成流程实例的更多相关文章

  1. JBPM工作流(五)——执行流程实例

    概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...

  2. 工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)

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

  3. JBPM学习(四):执行流程实例

    概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...

  4. JBPM学习(四):运行流程实例

    概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包含了全部执行阶段,当中最典型的属性就是跟踪当前节点的指针,例如以下图. Exe ...

  5. JBPM学习(二):ProcessEngine与Service API

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

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

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

  7. Activiti工作流学习(二)流程实例、执行对象、任务

    一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流 ...

  8. JBPM流程实例(PI)Process Instance

    /** * 流程实例 *    *  启动流程实例 *    *  完成任务 *    *  查询 *      *  查询流程实例 *      *  查询任务 *          *  查询正在 ...

  9. JBPM学习(五):流程变量

    1.启动流程实例 // 启动流程实例 @Test public void startProcessInstance() { // 使用指定key的最新版本的流程定义启动流程实例 ProcessInst ...

随机推荐

  1. Linux上跑两个版本的php,5.4.45和5.3.24

    首先,装的实在艰难,所以容我吐槽两句: PHP好个P,两个小版本都不兼容,把这个php5.3.24放在5.4.45环境下都跑不了.对于我这种用多了向下兼容的java的人来说,简直无法想象! 网上有装俩 ...

  2. win8安装mysql5.5最后配置没有反应

    win8安装mysql5.5最后配置没有反应 win8下安装mysql5.5一路顺利,可是到最后一步配置mysql服务及登录password后.注冊服务并启动服务界面一直没有不论什么反应: 本来以为是 ...

  3. HDU 4193 Non-negative Partial Sums(想法题,单调队列)

    HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...

  4. 基于C++11的线程池

    1.封装的线程对象 class task : public std::tr1::enable_shared_from_this<task> { public: task():exit_(f ...

  5. SpringMVC+Mybatis架构中的问题记录

    2014/08/16 记录 今天遇到个问题.折腾了我大约4个小时,好坑啊由于之前没遇到过 我的包是这么分的:com.project名.模块名.service.impl     在spring 配置这个 ...

  6. hdu2993之斜率dp+二分查找

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. Android 获取手机信息

    private void initData() { TelephonyManager mTm = (TelephonyManager) getActivity().getSystemService(C ...

  8. python filter map reduce

    filter(function, iterable): Construct a list from those elements of iterable for which function retu ...

  9. ERR Unsupported CONFIG parameter: notify-keyspace-events; nested exception is redis.clients.jedis.exceptions.JedisDataException

    异常信息 时间:2017-04-05 15:53:57,361 - 级别:[ WARN] - 消息: [other] The web application [ROOT] appears to hav ...

  10. jsp程序设计:jstl之JSTL标签库

    转载自:http://www.blogjava.net/haizhige/archive/2008/10/26/236783.html,个人进行了一些修改. 前言:写一个taglib一般可以继承Sim ...