`
a453228609
  • 浏览: 34259 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JBPM4之基础概念

    博客分类:
  • jbpm
阅读更多

流程定义引擎:

ProcessEngine processEngine;

获取:

processEngine=Configuration.getProcessEngine();

重要的几个接口:

RepositoryService repositoryService;

ExecutionService executionService;

TaskService taskService;

HistoryService historyService;

ManagementService managementService;

获取:

repositoryService=processEngine.getRepositoryService();

executionService=processEngine.getExecutionService();

taskService=processEngine.getTaskService();

historyService=processEngine.getHistoryService();

managementService=processEngine.getManagementService();

说明:

RepositoryService主要用来管理和发布流程定义,发布流程定义、删除流程定义、查看流程定义。

流程定义发布:

repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy();

:此方法表示从classpath路径加载一个流程定义文件,并发布,上例中demo.jpdl.xml文件位于src(classpath)路径下,若流程定义文件放置与包中,则需要使用包名+jpdl文件名。如com/jbpm/demo.jpdl.xml

查看流程定义:

repositoryService.createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy();

List<ProcessDefinition> list=repositoryService.createProcessDefinitionQuery().list();

for (ProcessDefinition processDefinition : list) {

   System.out.println("流程定义Id:"+processDefinition.getId());

   System.out.println("流程部署Id:"+processDefinition.getDeploymentId());

}

删除流程定义:

String deploymentId=repositoryService.createDeployment().addResourceFromClasspath("test1.jpdl.xml").deploy();

repositoryService.deleteDeploymentCascade(deploymentId);

deploymentId为流程定义部署Id

ExecutionService主要用来操作流程实例,启动流程实例、查看流程实例、删除流程实例、结束流程实例。

其前提条件是发布了流程定义

启动流程实例:

repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy();

      ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo");

使用executionService.startProcessInstanceByKey("demo");方法来启动一个流程实例。其中startProcessInstanceByKey就表示以key的方式来启动流程实例,key为流程定义文件中process节点的key属性,若未明确给出key属性,则默认key属性的值与name属性的值相同。

同样也可以使用executionService.startProcessInstanceById(processDefinitionId)的方式来启动流程实例。此方法是用流程定义文件中process节点的id属性来启动流程实例。

Id属性由两部分组成流程定义的key和流程定义的版本来组成。形如key-version

例如:

ProcessInstance processInstance=executionService.startProcessInstanceById("demo-1");

其中demo-1就为流程定义中的流程Id,其keydemo,版本号为1

同样使用此方法可用来启动指定版本号的流程实例。

查看流程实例:

List<ProcessInstance> list=executionService.createProcessInstanceQuery().list();

for (ProcessInstance processInstance : list) {

   System.out.println("流程实例Id:"+processInstance.getId());

   System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId());

}

级联删除流程实例:

executionService.deleteProcessInstanceCascade(processInstance.getId());

结束流程实例:

executionService.endProcessInstance(processInstance.getId(), "结束流程实例");

注意:在使用executionService.endProcessInstance()对流程实例进行结束操作后,需要重新查询processInstance才能得到更新后的流程实例,如果流程已结束,则查询结果为null

如:

executionService.endProcessInstance(processInstance.getId(), "结束流程实例");

System.out.println(processInstance.isEnded());

此行代码是无意义的,因为此时并未获取到更新后的流程实例,需要重新查询流程实例,所以此处返回为false

System.out.println("-----------查询流程实例--------------->");

List<ProcessInstance> list=executionService.createProcessInstanceQuery().list();

for (ProcessInstance processInstance : list) {

   System.out.println("流程实例Id:"+processInstance.getId());

   System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId());

}

结果:

false

-----------查询流程实例--------------->

使流程向下执行:

在使用executionService启动流程实例后,流程会顺着向下执行(即启动流程实例后,流程会从start节点向下移动),statetask节点,流程会暂停下来,满足条件后流程会向下继续执行,直到流程end节点,结束流程。

在程序中是流程遵循某一条件,沿着某个方向流动的方法为executionService.signalExecutionById();

该方法有多个重载:

ProcessInstance signalExecutionById(String executionId);

//若在流程定义某一个节点没有分支时(只有一个transition),调用此方法,可将流程继续向下执行 executionId为流程实例Id

ProcessInstance signalExecutionById(String executionId, String signalName);

//若在流程定义某一个节点有多个分支时(有多个transition),调用此方法,可将流程沿着transition所指的方向向下执行

executionId为流程实例Id, signalName为流程定义中transition节点的name属性的值

ProcessInstance signalExecutionById(String executionId, String signalName, Map<String, ?> parameters);

用于将流程沿着signalName方向(transitionname属性所指的方向)向下继续执行,在执行的过程中顺便传递参数parameters

ProcessInstance signalExecutionById(String executionId, Map<String, ?> parameters);

用于将流程向下继续执行,在执行的过程中顺便传递参数parameters

:当一个节点有多个分支时,若要通过signalExecutionById()方法将流程向下执行必须明确指出signalName(transitionname属性所指的方向),否则流程不会向下执行,仍会停留在当前节点。因为jbpm不确定流程该流向那个方向。

示例代码:

1. 没有分支的state流向

流程定义文件:

<?xmlversion="1.0"encoding="UTF-8"?>

<processname="demo"xmlns="http://jbpm.org/4.3/jpdl">

   <startname="start"g="87,113,48,48">

      <transitionname="to state"to="state"g="-53,-17"/>

   </start>

   <statename="state"g="238,236,92,52">

      <transitionname="to end"to="end"g="-41,-17"/>

   </state>

   <endname="end"g="384,367,48,48"/>

</process>

测试代码:

import org.jbpm.api.Configuration;

import org.jbpm.api.ExecutionService;

import org.jbpm.api.ProcessEngine;

import org.jbpm.api.ProcessInstance;

import org.jbpm.api.RepositoryService;

import junit.framework.TestCase;

publicclass DemoTest extends TestCase{

   ProcessEngine processEngine;

   RepositoryService repositoryService;

   ExecutionService executionService;

   @Override

   protectedvoid setUp() throws Exception {

      processEngine=Configuration.getProcessEngine();

      repositoryService=processEngine.getRepositoryService();

      executionService=processEngine.getExecutionService();

      //部署流程定义

   repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy();

   }

   publicvoid testProcessInstance(){

      ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo");

      System.out.println("流程实例Id:"+processInstance.getId());

      System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId());

      //判断当前是否位于start节点

      System.out.println("是否位于start节点:"+processInstance.isActive("start"));

      //判断当前是否位于state节点

      System.out.println("是否位于state节点:"+processInstance.isActive("state"));

      //判断流程是否结束

      System.out.println("判断流程是否结束:"+processInstance.isEnded());

      System.out.println("------------------------>使流程继续向下执行");

      //使流程继续向下执行

      //ProcessInstance instanceState=executionService.signalExecutionById(processInstance.getId());

      //此处也可以这么写

      ProcessInstance instanceState=executionService.signalExecutionById(processInstance.getId(),"to end");

      //to end为流程定义中用于连接stateend节点之间transitionname属性的值

      //判断当前是否位于state节点

      System.out.println("是否位于state节点:"+instanceState.isActive("state"));

      //判断流程是否结束

      System.out.println("判断流程是否结束:"+instanceState.isEnded());

   }

}

执行结果:

流程实例Id:demo1.7

流程定义Id:demo1-1

是否位于start节点:false

是否位于state节点:true

判断流程是否结束:false

------------------------>使流程继续向下执行

是否位于state节点:false

判断流程是否结束:true

2. 含有分支的state流向

流程定义文件:

<?xmlversion="1.0"encoding="UTF-8"?>

<processname="demo"xmlns="http://jbpm.org/4.3/jpdl">

   <startg="347,27,48,48"name="start">

      <transitiong="-53,-17"name="to state"to="state"/>

   </start>

   <stateg="329,132,92,52"name="state">

      <transitionname="to 200"to="200"g="-41,-17"/>

      <transitionname="to 400"to="400"g="-41,-17"/>

   </state>

   <endg="358,321,48,48"name="end"/>

   <statename="200"g="420,226,92,52">

      <transitionname="to end"to="end"g="-41,-17"/>

   </state>

   <statename="400"g="266,225,92,52">

      <transitionname="to end"to="end"g="-41,-17"/>

   </state>

</process>

测试代码:

import junit.framework.TestCase;

public class Demo2Test extends TestCase{

   ProcessEngine processEngine;

   RepositoryService repositoryService;

   ExecutionService executionService;

   @Override

   protected void setUp() throws Exception {

      processEngine=Configuration.getProcessEngine();

      repositoryService=processEngine.getRepositoryService();

      executionService=processEngine.getExecutionService();

      //部署流程定义

   repositoryService.createDeployment().addResourceFromClasspath("demo.jpdl.xml").deploy();

   }

   public void testProcessInstance(){

      ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo");

      System.out.println("流程实例Id:"+processInstance.getId());

      System.out.println("流程定义Id:"+processInstance.getProcessDefinitionId());

      //判断当前是否位于start节点

      System.out.println("是否位于start节点:"+processInstance.isActive("start"));

      //判断当前是否位于state节点

      System.out.println("是否位于state节点:"+processInstance.isActive("state"));

      //判断流程是否结束

      System.out.println("判断流程是否结束:"+processInstance.isEnded());

      System.out.println("------------------------>使流程继续向下执行");

      //不明确指出流动方向,看流程位于那个节点

      ProcessInstance instance=executionService.signalExecutionById(processInstance.getId());

      //判断当前是否位于state节点

      System.out.println("是否位于state节点:"+instance.isActive("state"));

      //判断流程是否结束

      System.out.println("判断流程是否结束:"+instance.isEnded());

   }

}

执行结果:

流程实例Id:demo.7

流程定义Id:demo-1

是否位于start节点:false

是否位于state节点:true

判断流程是否结束:false

------------------------>使流程继续向下执行

是否位于state节点:true

判断流程是否结束:false

指明流向节点:

ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo");

      System.out.println("------------------------>使流程继续向下执行");

      System.out.println("------------------------>使流程流向200");

      ProcessInstance processInstance200=executionService.signalExecutionById(processInstance.getId(), "to 200");

      System.out.println("当前流程是否位于200节点---->"+processInstance200.isActive("200"));

      System.out.println("当前流程是否结束---->"+processInstance200.isEnded());

      /*System.out.println("------------------------>使流程流向400");

      ProcessInstance processInstance400=executionService.signalExecutionById(processInstance.getId(), "to 400");

      System.out.println("当前流程是否位于400节点---->"+processInstance400.isActive("400"));

      System.out.println("当前流程是否结束---->"+processInstance400.isEnded());*/

执行效果:

------------------------>使流程继续向下执行

------------------------>使流程流向200

当前流程是否位于200节点---->true

当前流程是否结束---->false

上述代码中使用signalExecutionById()方法时,传入的是流程实例的Id,也可以使用以下代码来完成同样的工作:

ProcessInstance processInstance=executionService.startProcessInstanceByKey("demo");

      //查询该流程实例的活动节点

      System.out.println(processInstance.findActiveActivityNames());

      //因为流程实例启动后,它会自动向下执行,直到遇到statetask等节点时暂停下来,在我们的流程定义文件中紧跟在start后的节点为state,所以流程实例会在state节点暂停下来

      Execution execution=processInstance.findActiveExecutionIn("state");

      ProcessInstance processInstance200=executionService.signalExecutionById(execution.getId(), "to 200");

      System.out.println("当前流程是否位于200节点---->"+processInstance200.isActive("200"));

      System.out.println("当前流程是否结束---->"+processInstance200.isEnded());

      //使流程继续向下执行(结束)

      System.out.println("-------使流程继续向下执行(结束)------->");

      ProcessInstance instance=executionService.signalExecutionById(processInstance200.getId());

      System.out.println("当前流程是否结束---->"+instance.isEnded());

执行结果:

[state]

当前流程是否位于200节点---->true

当前流程是否结束---->false

-------使流程继续向下执行(结束)------->

当前流程是否结束---->true

关于流程实例几个重要的方法:

processInstance.isEnded()判断程实例是否结束结束返回true,否则返回false

processInstance.isActive(“A”)判断当前流程是否处于A节点

谨记executionService.signalExecutionById(String executionId, String signalName)方法中executionId为流程实例Id,signalName为流程向下执行的transitionname属性的值,而不是下一个节点的名称。

 

出处http://www.blogjava.net/sxyx2008/

分享到:
评论

相关推荐

    JBPM7基础开发

    简单描述流程引擎相关概念和以jbpm7为基础的开发方式和实现方式做简单的说明

    JBPM4工作流应用开始指南.rar

    第一篇 jBPM工作流开发基础 1 第1章 工作流基础 2 1.1 工作流概念 2 1.1.1 工作流管理思想之于企业现代化管理 2 1.1.2 工作流技术在企业中的应用 5 1.1.3 如何从一个开发者的角度看工作流技术 6 1.2 工作流管理系统...

    jbpm工作流管理系统

    介绍JBPM的基本流程概念、实例执行的概念及使用JBPM的区别

    工作流基本概念及JBPM简介

    工作流引擎的简单介绍,对于概念和基本架构讲述的比较清楚,需要了解工作流的可以看。

    工作流基本概念及jbpm简介

    工作流基本概念及jbpm简介PPT,这是公司内部培训PPT,是初学入门的好课件,推荐给大家。

    工作流基本概念及JBPM简介.ppt

    工作流基本概念及JBPM简介

    工作流基本概念及jBPM简介

    工作流基本概念简介 工作流系统功能特性描述 开源工作流引擎jBpm的介绍

    jbpm安装及使用方法

    jbpm中最重要的概念,应该是令牌(Token)和信令(Signal)。在整个流程实例运行过程中,我们可以迅速的利用token得到其当前的current state。在解决“并行”等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种...

    JBPM4.4教程

    JBPM4.4教程,内含jbpm表结构的搭建,流程的基本流转过程,以及重要概念的详细讲解

    jBPM4.1中文用户手册

    建议读者先自行上网了解jbpm的基本概念以及流程的定义等基础知识,在理解了jbpm的基础之上学习这份文档会有更大的收获!

    jbpm工作流.ppt

    工作流基本概念及jBpm简介 适用于刚接触工作流、jbpm

    深入浅出jBPM完整版part1

    ...................................15 1.3.3 测试helloworld流程......................16 第 2 章 jBPM 基础...........................................19 2.1 JbpmConfiguration和 JbpmContext..................

    jbpm的实现流程图.doc

    一、流程定义的基本概念: 二、流程执行的基本概念: 三、流程引擎核心调度过程 ----------------------- jbpm的实现流程图全文共3页,当前为第1页。 jbpm的实现流程图全文共3页,当前为第2页。 ࠀ࠘ࠚࠜࣾऀंऄआ...

    jbpm在OA系统中的应用

    jbpm在OA系统中的应用,2007年的硕士论文,有点老,了解基本概念可以

    Jbpm 工作流 编程步骤全过程

    Jbpm 工作流在普通的应用中,基本上对数据库进行一次操作代表着一个业务的发生,等操作完成后,也就标示着业务的完成。例如用户注册这个业务。只要向数据库中添加一条记录,就标示着业务的完成。 但是对于一个报销...

    揭秘jbpm流程引擎内核设计思想及构架

    火龙果软件工程技术中心 1前言 2阅读本篇的基础准备 2.1概念的基础 2.2环境的基础 3什么是流程引擎内核? 4引擎内核所关注的四个主要问题 4.1模型与定义对象 4.2调度机制与算法 4.3执行机制与状态 4.4实例...

    深入浅出jBPM完整版part2

    ...................................15 1.3.3 测试helloworld流程......................16 第 2 章 jBPM 基础...........................................19 2.1 JbpmConfiguration和 JbpmContext..................

    工作流概念及模型的研究(学士学位论文)

    2.工作流的基本概念 12 2.1 WFMC对工作流的定义 12 2.2 业务流程 16 2.2.1概念 16 2.2.2 业务流程定义语言的介绍 17 2.2.3 业务流程的建立需要遵循的原则 18 2.3 工作流中间件 18 2.3.1 工作流中间件的概念 18 ...

    jpbm4.4学习文档及数据库表结构

    jbpm4.4入门学习的好文档 1.工作流基础 2.开发环境 3.核心概念与相关api 4.processenginee serviceapi 5.管理流程定义 6.执行流程实例 7.流程定义语言 8.应用 与其他框架的集成

Global site tag (gtag.js) - Google Analytics