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

JBPM学习(三)--引擎与5个服务

 
阅读更多

JBPM服务

参考文档:jbpm-4.4\doc\userguide\html_single\index.html
jbpm-4.4\doc\javadocs\index.html

一:流程定义,实例化和执行(Process definition, process instance and executions)


流程定义描述的过程中的步骤。
一个流程实例代表一个特定的应用程序运行的过程定义。
一个流程实例包含了所有的运行状态。最突出的是跟踪当前活动的指针。

二:流程引擎(ProcessEngine)

使用jBPM交互是通过服务实现的。服务接口可以从流程引擎获取到,而流程引擎由Configuration对象建立。

下面我们看看ProcessEngine的集中构建方式:
1:获取默认ProcessEngine对象。
ProcessEngine pe = Configuration.getProcessEngine();
这个是通过静态方法获取的单例对象,它默认会根据jar包中org/jbpm/api/Configuration路径下的
jbpm.cfg.xml文件来配置该对象。看看源码:

public static ProcessEngine getProcessEngine()
    {
        if(singleton == null)
            synchronized(org/jbpm/api/Configuration)
            {
                if(singleton == null)
                    singleton = (new Configuration()).setResource("jbpm.cfg.xml").buildProcessEngine();
            }
        return singleton;
    }

    private static ProcessEngine singleton;
2:实例化一个新的Configuration对象来构建ProcessEngine。
ProcessEngine pe2 = new Configuration().buildProcessEngine();
这个方法和上面一样的,就是不是单例模式罢了。

3:通过自定义的配置文件来构建。
ProcessEngine pe3 = new Configuration().setResource("my-own-configuration-file.xml").buildProcessEngine();

构建完成后,我们还可以设置其他属性,XmlString,InputSource,URL,HibernateSessionFactory或File。
这些我们都可以在spring中实现注入。

三:服务接口。

上面说的有些多了,我们使用流程引擎就是为了获取服务接口对象,这才是重点。
下面涉及的api较多,但是都很重要,想要学习好JBPM,其实就是对这些api的熟练使用。
万里长城才起步,任重道远啊。

RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();

1:流程资源服务RepositoryService。


1-1:发布流程
首先获取NewDeployment对象。

NewDeployment  newDeployment=repositoryService.createDeployment();
NewDeployment可以发布新流程,api文档中提供了多种发布方式:
//从classpath加载流程定义文件(xxx.jpdl.xml)
 NewDeployment	addResourceFromClasspath(java.lang.String resourceName) 
//通过File对象加载
 NewDeployment	addResourceFromFile(java.io.File file) 
//通过输入流加载
 NewDeployment	addResourceFromInputStream(java.lang.String resourceName, java.io.InputStream inputStream) 
//通过字符串加载
 NewDeployment	addResourceFromString(java.lang.String resourceName, java.lang.String string) 
//通过URL加载
 NewDeployment	addResourceFromUrl(java.net.URL url) 
//通过zip文件流加载
 NewDeployment	addResourcesFromZipInputStream(java.util.zip.ZipInputStream zipInputStream) 
然后调用发布的方法.deploy();
例子
repositoryService.createDeployment().addResourceFromClasspath("org/jbpm/config/process.jpdl.xml").deploy(); 
流程部署后,会生成{key}-{version}格式的流程定义ID,如果流程定义文件未指明key和
version,程序将使用流程名称作为key,根据当前数据库存储情况生成version(version = key
的数量+1)。
生成的key将不是数字和字母的字符,替换为下划线。

1-2:删除流程。

repositoryService.deleteDeployment(deploymentId);//流程定义没有执行时

repositoryService.deleteDeploymentCascade(deploymentId);
//级联删除,包含的流程定义,相关的流程实例和他们的历史信息
1-3:查询流程。
List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery().list();
上面是查询所有的流程,当然也可以
根据某些参数来查,只要添加参数就可以了,如下:
List<ProcessDefinition> processDefinitions = repositoryService
		.createProcessDefinitionQuery()
		.processDefinitionId("")//参数是流程定义的id
		.processDefinitionKey("")//参数是流程定义的key
		.processDefinitionName("")//参数是流程定义的name
		.processDefinitionNameLike("")//参数是流程定义的name,进行模糊查询
		.list();//查询

1-4:挂起和回复流程。
repositoryService.resumeDeployment(deploymentId) //恢复
repositoryService.suspendDeployment(deploymentId) //挂起
*****************************************************************************
2:流程执行服务ExecutionService。

ExecutionService管理运行过程中执行。

2-1:启动流程实例。
ProcessInstance  pi1=executionService.startProcessInstanceById("ICL");//根据id
ProcessInstance  pi2=executionService.startProcessInstanceByKey("ICL-1");//根据流程版本

//使用变量启动
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("customer", "John Doe");
variables.put("type", "Accident");
variables.put("amount", new Float(763.74));

ProcessInstance pi3 = 
    executionService.startProcessInstanceByKey("ICL", variables);

2-2:执行等待新号。
当使用一个state活动时,当它到达的状态时,执行过程(或流程实例)将停止,等待一个信号(也叫外部触发器)。 signalExecution方法都可以用于此。
ProcessInstance pi4=executionService.signalExecutionById("");//参数executionId执行id

首选的方式来获得正确的执行是通过一个监听器来捕获state(状态)的活动,如:

<state name="wait">
  <on event="start">
    <event-listener class="org.jbpm.examples.StartExternalWork" />
  </on>
  ...
</state>
有一个可选的(不太推荐的)的方式,来获得流程执行到达时的状态活动。
如果你知道后,jBPM的API调用执行活动已经进入了状态,才获得这个执行的id:
ProcessInstance processInstance = 
  executionService.startProcessInstanceById(processDefinitionId);

Execution execution = processInstance.findActiveExecutionIn("external work");
String executionId = execution.getId();

*****************************************************************************
3:流程任务服务TaskService。


3-1:任务列表
服务TaskService的主要目的是提供访问任务列表。

//查找指定用户的任务列表
List<Task> taskList = taskService.findPersonalTasks("johndoe");
//查找指定组的任务列表
List<Task> groupTaskList = taskService.findGroupTasks("mygroup");

3-2:读写数据
一般来说,任务会提供一个表单,显示在一些用户接口。
表单需要是能够读取和写入相关的任务的数据。

Object obj=taskService.getVariable(taskId, variableName);
Map<String, Object> mp=taskService.getVariables(taskId, variableNames);
Set<String> set=taskService.getVariableNames("");

3-3:完成任务

taskService.completeTask(taskId);
taskService.completeTask(taskId, variables);
taskService.completeTask(taskId, outcome);
taskService.completeTask(taskId, outcome, variables);

该API允许任务完成之前,提供一个map,添加到流程实例。
另外,也可以提供一种“结果”,将被用来确定哪个走向将被选择。逻辑如下:

a)如果一个任务有一个没有name的transition:
If a task has one outgoing transition without a name then:

taskService.getOutcomes() //returns a collection that includes one null value
taskService.completeTask(taskId) //will take that outgoing transition
taskService.completeTask(taskId, null) //will take that outgoing transition
taskService.completeTask(taskId, "anyvalue") //will result in an exception

b)如果一个任务有一个有name的transition:
If a task has one outgoing transition with a name then:

taskService.getOutcomes() //returns a collection that includes only the name of the transition
taskService.completeTask(taskId) //will take the single outgoing transition
taskService.completeTask(taskId, null) //will will result in an exception (as there is no transition without a name)
taskService.completeTask(taskId, "anyvalue") //will result in an exception
taskService.completeTask(taskId, "myName") //will take the transition with the given name


c)如果一个任务拥有多个transition,而其中一个没有name,其他都有name:
If a task has multiple outgoing transitions. One transition has no a name and the other transition have a name:

taskService.getOutcomes() //returns a collection that includes a null value and the names of the other transitions
taskService.completeTask(taskId) //will take the transition without a name
taskService.completeTask(taskId, null) //will take the transition without a name
taskService.completeTask(taskId, "anyvalue")// will result in an exception
taskService.completeTask(taskId, "myName") //will take the 'myName' transition


d)如果一个任务拥有多个transition,并且都有唯一的name:
If a task has multiple outgoing transitions and all of them are uniquely named, then:

taskService.getOutcomes() //returns a collection that includes all the names of all the transitions
taskService.completeTask(taskId) //will result in an exception, since there is no transition without a name
taskService.completeTask(taskId, null) //will result in an exception, since there is no unnamed transition
taskService.completeTask(taskId, "anyvalue") //will result in an exception
taskService.completeTask(taskId, "myName") //will take the 'myName' transition

看上面的说明有些不理解,首先看一个流程定义的文件myprocess.jpdl.xml:

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

<process name="myprocess" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="90,129,48,48">
      <transition name="to state1" to="state1" g="-56,-22"/>
   </start>
   <state name="state1" g="307,127,92,52">
      <transition name="to end1" to="end1" g="-50,-22"/>
   </state>
   <end name="end1" g="564,128,48,48"/>
</process>

*****************************************************************************
4:流程历史服务HistoryService。


流程实例的运行时的执行过程中,生成事件。从这些事件中,运行和完成流程的历史信息被收集到历史表中。
HistoryService提供了访问这些信息。

List<HistoryTask> task=historyService.createHistoryTaskQuery().taskId("").list();
List<HistoryProcessInstance> hps=historyService.createHistoryProcessInstanceQuery().processDefinitionId("").list();
List<HistoryActivityInstance> hais=historyService.createHistoryActivityInstanceQuery().processDefinitionId("").activityName("").list();

*****************************************************************************
5:流程管理服务ManagementService。

管理服务通常用来管理job。

List<Job> joblist=managementService.createJobQuery().processInstanceId("").list();




api到此算是看了个大概,后面该了解流程定义文件jPDL中的东西了,毕竟对一个流程都不清楚,
更谈不上操作流程了。






分享到:
评论

相关推荐

    jbpm-2.0-beta1.zip_java 工作流引擎_jbpm_jbpm-demo_工作流_工作流引擎

    jbpm-demo是jbpm附带的演示项目,它包含了多个示例流程,如请假审批流程、采购流程等,这些实例为初学者提供了实践和学习的机会。通过jbpm-demo,用户可以直观地了解如何部署和运行工作流,以及如何与工作流系统进行...

    JBPM-----PPT

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

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

    总之,jBPM作为强大的工作流引擎,其测试代码是学习和掌握其核心功能的关键。通过深入理解和实践这些代码,开发者可以更好地设计、实施和测试业务流程,提升企业流程自动化的能力。希望这篇关于《深入浅出jBPM:1-6...

    jbpm-gpd-feature.rar_jbpm gpd feature_jbpm-gpd

    jbpm-gpd-feature.rar 是一个与jbpm工作流引擎相关的资源包,主要针对Eclipse集成开发环境提供的jbpm图形化流程设计(Graphical Process Designer,简称GPD)插件。jbpm是一个开源的工作流管理系统,它允许开发者...

    jbpm-4.3-src.rar_bdf-jbpm4 src _jboss 4.3_jboss jbpm4.3_jbpm-4.3

    5. **源码分析**:通过查看jbpm-4.3-src中的源码,开发者可以深入了解jBPM的工作原理,学习如何实现复杂的流程控制逻辑,以及如何自定义任务服务、事件处理和规则引擎等核心组件。 6. **学习路径**:对于初学者,...

    jbpm5.2学习1------安装与配置

    **jbpm5.2学习1——安装与配置** jbpm(Java Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的解决方案,用于管理和执行业务流程。jbpm5.2是该系统的较早版本,但即便如此,它仍包含...

    jbpm学习指南-初学者的宝典

    ### 三、jbpm学习路径 1. **BPMN基础知识**:学习BPMN的基本符号和语义,理解流程图的构建。 2. **jbpm安装与配置**:搭建jbpm开发环境,安装jbpm工具集,如jbpm-workbench。 3. **jbpm示例分析**:通过`jbpm-...

    工作流jbpm---学习文档+简单实例项目

    总结来说,这个资源包提供了一套全面的学习路径,从理论知识到实践案例,涵盖了jbpm的核心概念和与SSH框架的整合。对于希望掌握jbpm的开发者而言,这是一个宝贵的参考资料,可以帮助他们快速上手,并在实际项目中...

    jbpm-starters-kit-3.1.2.part1_part2

    5. **监控与报表**:jbpm提供监控工具,可以查看流程实例的状态、性能指标,并生成报表,以便于优化和调试流程。 6. **图形化建模**:使用jbpm提供的建模工具,如jBPM Designer,可以图形化地设计和编辑业务流程...

    jbpm-starters-kit-3.1.2.part1

    jbpm-starters-kit-3.1.2.part1 和 jbpm-starters-kit-3.1.2.part2 是两个分卷压缩文件,它们共同组成一个完整的jbpm开发入门套件。jbpm(Java Business Process Management)是一个开源的工作流管理系统,用于实现...

    jbpm-kaifashouce-daquan

    【jbpm-kaifashouce-daquan】是一个与企业流程管理相关的资源集合,主要涵盖了jbpm(Java Business Process Management)的开发源码和工具。jbpm是一个开源的工作流管理系统,它提供了一整套用于设计、执行、管理和...

    jbpm-demo-master.zip_DEMO_activiti-master_jbpm-demo_mean3x7

    jbpm-demo-master.zip_DEMO_activiti-master_jbpm-demo_mean3x7是一个包含多个工作流演示项目的压缩包,主要涉及jbpm(Java Business Process Management)和activiti两个流行的工作流引擎。jbPM是JBoss组织开发的一...

    jbpm中文教程-详细

    5. 工作流引擎(Workflow Engine):jbpm的工作流引擎负责解析流程定义,调度任务,并管理流程实例的生命周期。 二、jbpm与Hibernate的集成 Hibernate作为Java领域最流行的ORM(Object-Relational Mapping)框架,...

    jbpm中文文档--英文文档

    5. **运行与调试**:说明如何启动jbpm服务,部署流程定义,以及如何在运行时监控和调试流程实例。 6. **API使用**:介绍jbpm提供的Java API,包括ProcessEngine、RepositoryService、TaskService等,以及如何在代码...

    jbpm_test.rar_ProcessImageTag_TestJBPM_jbpm_jbpm-te_报销

    JBPM是一个强大的工作流引擎,它支持BPMN 2.0标准,允许开发者用图形化的方式定义复杂的业务流程。它提供了一个全面的工具集,包括流程建模、部署、执行、监控和分析等。JBPM不仅支持业务规则的集成,还能够与各种...

    jbpm-3.1.2.zip_jbpm_jbpm 3.1.2_jbpm-3.1.2.rar_jbpm3.1.2_工作流

    5. **服务调用**:能够无缝集成外部服务,如 Web Services 或 EJB,实现业务流程的跨系统交互。 6. **任务管理**:提供了用户友好的任务分配和管理界面,便于用户跟踪和处理任务。 7. **监控与日志**:提供详细的...

    jbpm-4.4.zip part03

    4. **集成能力**:jbpm可与Java EE、Spring等框架无缝集成,也可以与各种企业服务,如EJB、Web服务等进行交互,提供灵活的扩展性。 5. **任务管理**:jbpm提供任务服务,允许用户分配、接收、完成和转移任务,支持...

    jbpm-release-notes-4.4.txt

    ### jBPM 4.4版本更新概览与关键特性 #### 一、jBPM 4.4发行说明及文档资源 jBPM(Java Business Process Model)是一款开源的工作流引擎,它允许用户设计、执行和管理业务流程。jBPM 4.4版本的发行说明提供了一...

    jbpm-6.1.0.Final-installer

    1. **工作流引擎**:jBPM的核心是一个强大的工作流引擎,能够执行基于BPMN 2.0标准的工作流定义。BPMN是一种图形化表示法,用于描述业务流程,包括任务、决策、事件和流程分支等元素。 2. **Guvnor**:Guvnor是jBPM...

    jbpm4.4-demo

    此外,它还展示了jbpm的人力任务服务,即如何与用户交互处理流程中的任务。 在深入研究jbpm4.4-demo时,你将学习到如何使用jbpm提供的API和工作流服务,如流程实例的启动、任务的领取和完成、流程变量的获取和修改...

Global site tag (gtag.js) - Google Analytics