`
sunbin
  • 浏览: 354455 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JBPM4之基础概念2-流程部署

    博客分类:
  • jbpm
 
阅读更多



 

 

 代码

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.ManagementService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;

public class Test {
 ProcessEngine processEngine;
 RepositoryService repositoryService;
 ExecutionService executionService;
 TaskService taskService;
 HistoryService historyService;
 ManagementService managementService;
 public static void main(String[] args) {
  Test t=new Test();
  t.process();
 }
 
 public  void process() {
  
  processEngine=Configuration.getProcessEngine();
  repositoryService=processEngine.getRepositoryService();
  executionService=processEngine.getExecutionService();
  
  //定义流程processEngine repositoryService
    String deploymentId=repositoryService.createDeployment().addResourceFromClasspath("hellworld.jpdl.xml").deploy();
    String deploymentId1=repositoryService.createDeployment().addResourceFromClasspath("hellworld.jpdl.xml").deploy();
    List<ProcessDefinition> list=repositoryService.createProcessDefinitionQuery().list();
    System.out.println("11111111111111111111111流程定义");
         String processId=null;//后面用到processId
    for(ProcessDefinition processDefinition:list){
         if (null==processId) {//后面用到processId
          processId=processDefinition.getId();//后面用到processId
         }
      System.out.println("流程定义:"+processDefinition.getId());
      System.out.println("流程部署:"+processDefinition.getDeploymentId());
    }
  //删除流程deploymentId1
    System.out.println("222222222222222222222222流程删除");
//    repositoryService.deleteDeploymentCascade(deploymentId1);
     list=repositoryService.createProcessDefinitionQuery().list();
    for(ProcessDefinition processDefinition:list){
     System.out.println("流程定义:"+processDefinition.getId());
     System.out.println("流程部署:"+processDefinition.getDeploymentId());
    }
    
    /** 
   //建立流程实例
    System.out.println("333333333333333333333333333流程实例");
//  ProcessInstance processInstance=executionService.startProcessInstanceByKey("hellworld");
  ProcessInstance processInstance=executionService.startProcessInstanceById(processId);//用到processId
  List<ProcessInstance> list1=executionService.createProcessInstanceQuery().list();
  String processInstanceId=null;//后面用到processInstanceId
  for (ProcessInstance processInstance1 : list1) {
     if (null==processInstanceId) {
      processInstanceId=processInstance1.getId();//后面用到processInstanceId
     }
   System.out.println("流程实例key:"+processInstance1.getKey());
      System.out.println("流程实例Id:"+processInstance1.getId());
      System.out.println("流程定义Id:"+processInstance1.getProcessDefinitionId());

  }
  
  
  System.out.println("333333333333333333333333333删除流程实例");
  executionService.deleteProcessInstanceCascade(processInstanceId);//用到processInstanceId
   list1=executionService.createProcessInstanceQuery().list();
  for (ProcessInstance processInstance1 : list1) {
   System.out.println("流程实例key:"+processInstance1.getKey());
      System.out.println("流程实例Id:"+processInstance1.getId());
      System.out.println("流程定义Id:"+processInstance1.getProcessDefinitionId());
  }
  
  System.out.println("4444444444444444444444444结束流程实例");
  executionService.endProcessInstance(processInstanceId, "结束流程实例");
  list1=executionService.createProcessInstanceQuery().list();
   for (ProcessInstance processInstance1 : list1) {
    System.out.println("流程实例key:"+processInstance1.getKey());
       System.out.println("流程实例Id:"+processInstance1.getId());
       System.out.println("流程定义Id:"+processInstance1.getProcessDefinitionId());
   }
  */
   
   
  System.out.println("555555555555555555555555结束流程实例");
  ProcessInstance processInstance=executionService.startProcessInstanceByKey("hellworld");
  System.out.println(processInstance.isActive("测试1"));  
  System.out.println(processInstance.getId());
  processInstance = executionService.signalExecutionById(processInstance.getId(),"to 试测3" );
  Map hashmap=new HashMap();
  hashmap.put("var1", 5);
  processInstance = executionService.signalExecutionById(processInstance.getId(),"to exclusive1",hashmap);
  System.out.println(processInstance.isEnded());
  

 }
}

 

基础知识

 

流程定义引擎:

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属性的值,而不是下一个节点的名称。

  • 大小: 6 KB
  • 大小: 11.6 KB
  • 大小: 24.2 KB
分享到:
评论
1 楼 Franciswmf 2013-11-08  
先赞一个  

相关推荐

    JBPM4 常用表结构及其说明

    JBPM4是JBPM(Java Business Process Model)的一个版本,主要用于提供业务流程管理的功能。它通过一组数据库表来支持工作流的执行与跟踪。本文将详细介绍JBPM4中的常用表结构及其用途。 #### 一、资源库与运行时表...

    jBPM2-流程图与JBPM API.ppt

    - `RepositoryService`:管理流程部署,包括部署、撤销、查询等。 综上所述,jBPM2 是一个强大的业务流程管理工具,通过流程图和API,能够灵活地设计、执行和管理各种业务流程,满足不同场景下的需求。了解并掌握...

    JBPM-----PPT

    通过学习这些PPT,你将能够了解JBPM的工作原理,掌握流程设计、部署和监控的方法,同时也能了解其与外部系统的集成方式,从而在实际项目中有效地运用JBPM来优化和自动化业务流程。无论是初学者还是有经验的开发者,...

    JBPM4 开发文档 实例 流程

    - **JBPM4_DEPLOYPROP**:记录流程部署的属性。 - **JBPM4_EXECUTION**:维护流程实例的执行状态。 - **JBPM4_HIST_ACTINST**:保存流程活动实例的历史记录。 - **JBPM4_HIST_DETAIL**:流程历史的详细信息。 - **...

    jbpm4jbpm5

    总的来说,这个主题资料包提供了jbpm4和jbpm5的基础知识、实战经验和用户操作指导,对于想要学习或深化jbpm流程管理框架理解的开发者非常有价值。通过学习这些文档,开发者可以掌握jbpm的核心概念,熟练地设计和部署...

    jbpm4 完整的请假流程

    2. **设计和部署流程**:使用BPMN编辑器创建请假流程图,并将其部署到jbpm4服务器。 3. **启动流程实例**:通过API或用户界面启动请假流程,创建一个新的流程实例。 4. **任务管理**:模拟员工、经理和HR的角色,...

    完整工作流JBPM项目实战全过程教程2---项目详细讲解

    【标题】"完整工作流JBPM项目实战全过程教程2---项目详细...总之,这个教程是一个全面了解和掌握JBPM工作流管理系统的宝贵资源,涵盖了从基础概念到实际操作的多个层面,适合希望提升企业级业务流程管理能力的开发者。

    JBPM4.4完整可用审批流程

    3. **SQL脚本**:用于创建和初始化数据库表的SQL文件,这是JBPM4运行的基础,因为流程实例、任务和其他元数据需要存储在数据库中。 4. **测试用例**:可能包含测试流程执行和审批逻辑的JUnit或其他测试框架的测试类...

    jbpm4.4 简单请假流程

    jbpm4.4是JBoss企业级业务流程管理(Business Process Management)套件的一个版本,它提供了一整套工具和服务,用于设计、部署和执行业务流程。在这个“简单请假流程”中,我们可以深入理解jbpm4.4如何帮助开发者...

    jbpm工作流程

    - **jbpm工作流入门教程.pdf**:这可能是关于jbpm基础知识和实践操作的指南,包括流程设计、部署、执行等。 - **jb51.net.txt**:可能包含jb51网站上的相关文章链接或教程摘要,jb51.net是一个技术分享平台。 - *...

    jBPM-JPDL流程引擎

    此外,jBPM还提供了命令行工具和API,方便开发者进行流程部署、实例管理和监控。 **四、jBPM集成** jBPM可以轻松地与其他Java应用集成,如Spring框架。它还支持与各种数据库系统的连接,以及通过JMS、EJB、Web服务...

    jbpm的入门1--简单实例

    4. **部署流程定义** 部署流程定义到jbpm的运行时环境中,这通常通过jbpm的工作流部署服务完成。部署后,流程定义可以在jbpm的工作流引擎中运行。 5. **启动流程实例** 使用jbpm的API或工作流客户端,可以启动一...

    JBPM工作原理及表结构详解

    - **JBPM4_DEPLOYMENT**:存储流程部署的信息,如部署ID、时间戳和部署的元数据。 - **JBPM4_DEPLOYPROP**:关联部署的属性,如流程定义的版本号。 - **JBPM4_EXECUTION**:表示流程实例,记录执行状态和相关信息...

    jbpm-4.4.zip part03

    【jbpm-4.4.zip part03】这个压缩文件是关于jbpm 4.4版本的组成部分,jbpm(Java Business Process Management)是一个开源的工作流管理系统,它提供了业务流程建模、部署、执行和监控的功能。jbpm 4.4是该系统的一...

    jbpm4.4-demo

    jbpm(Java Business Process Management)是一个开源的工作流和业务流程管理系统,它提供了从设计、部署到执行、监控和管理业务流程的全面解决方案。 首先,我们要理解jbpm的核心概念。jbpm通过工作流定义语言...

    jbpm-5.4.0.Final-docs

    通过jbpm-5.4.0.Final-docs,用户可以深入学习这些概念,理解如何配置和部署jbpm,以及如何利用其特性来实现高效的企业业务流程管理。文档可能包含详细的示例、教程、API参考和最佳实践,是学习和使用jbpm不可或缺的...

    深入浅出jBPM.1-6章测试代码_jbpm-test.rar

    2. **流程部署** - **流程部署**:将流程定义文件(.bpmn或.bar)部署到jBPM仓库,使其可供执行。 - **KieSession**:执行流程的核心对象,负责流程实例的创建、启动和管理。 3. **流程实例的创建与启动** - **...

    jBPM4_app-first 视频 源码

    2. **基础概念介绍**:解释 BPMN 2.0 流程图元素,以及 jBPM4 中的术语,如流程定义、流程实例、任务等。 3. **流程建模**:演示如何使用 jBPM4 工具创建流程模型,包括任务、分支、决策节点等。 4. **源码解析**:...

    JBPM工作流程表结构关系解析文档下载

    除了这些核心表,JBPM还有其他辅助表,如用户会话表(`T_JBPM_USERSESSION`)、部署表(`T_JBPM_DEPLOYMENT`)、流程定义表(`T_JBPM_PROCESSDEFINITION`)等,它们共同构成了JBPM的完整数据模型。 在实际应用中,...

Global site tag (gtag.js) - Google Analytics