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-demo是jbpm附带的演示项目,它包含了多个示例流程,如请假审批流程、采购流程等,这些实例为初学者提供了实践和学习的机会。通过jbpm-demo,用户可以直观地了解如何部署和运行工作流,以及如何与工作流系统进行...
通过学习这些PPT,你将能够了解JBPM的工作原理,掌握流程设计、部署和监控的方法,同时也能了解其与外部系统的集成方式,从而在实际项目中有效地运用JBPM来优化和自动化业务流程。无论是初学者还是有经验的开发者,...
总之,jBPM作为强大的工作流引擎,其测试代码是学习和掌握其核心功能的关键。通过深入理解和实践这些代码,开发者可以更好地设计、实施和测试业务流程,提升企业流程自动化的能力。希望这篇关于《深入浅出jBPM:1-6...
jbpm-gpd-feature.rar 是一个与jbpm工作流引擎相关的资源包,主要针对Eclipse集成开发环境提供的jbpm图形化流程设计(Graphical Process Designer,简称GPD)插件。jbpm是一个开源的工作流管理系统,它允许开发者...
5. **源码分析**:通过查看jbpm-4.3-src中的源码,开发者可以深入了解jBPM的工作原理,学习如何实现复杂的流程控制逻辑,以及如何自定义任务服务、事件处理和规则引擎等核心组件。 6. **学习路径**:对于初学者,...
**jbpm5.2学习1——安装与配置** jbpm(Java Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的解决方案,用于管理和执行业务流程。jbpm5.2是该系统的较早版本,但即便如此,它仍包含...
### 三、jbpm学习路径 1. **BPMN基础知识**:学习BPMN的基本符号和语义,理解流程图的构建。 2. **jbpm安装与配置**:搭建jbpm开发环境,安装jbpm工具集,如jbpm-workbench。 3. **jbpm示例分析**:通过`jbpm-...
总结来说,这个资源包提供了一套全面的学习路径,从理论知识到实践案例,涵盖了jbpm的核心概念和与SSH框架的整合。对于希望掌握jbpm的开发者而言,这是一个宝贵的参考资料,可以帮助他们快速上手,并在实际项目中...
5. **监控与报表**:jbpm提供监控工具,可以查看流程实例的状态、性能指标,并生成报表,以便于优化和调试流程。 6. **图形化建模**:使用jbpm提供的建模工具,如jBPM Designer,可以图形化地设计和编辑业务流程...
jbpm-starters-kit-3.1.2.part1 和 jbpm-starters-kit-3.1.2.part2 是两个分卷压缩文件,它们共同组成一个完整的jbpm开发入门套件。jbpm(Java Business Process Management)是一个开源的工作流管理系统,用于实现...
【jbpm-kaifashouce-daquan】是一个与企业流程管理相关的资源集合,主要涵盖了jbpm(Java Business Process Management)的开发源码和工具。jbpm是一个开源的工作流管理系统,它提供了一整套用于设计、执行、管理和...
jbpm-demo-master.zip_DEMO_activiti-master_jbpm-demo_mean3x7是一个包含多个工作流演示项目的压缩包,主要涉及jbpm(Java Business Process Management)和activiti两个流行的工作流引擎。jbPM是JBoss组织开发的一...
5. 工作流引擎(Workflow Engine):jbpm的工作流引擎负责解析流程定义,调度任务,并管理流程实例的生命周期。 二、jbpm与Hibernate的集成 Hibernate作为Java领域最流行的ORM(Object-Relational Mapping)框架,...
5. **运行与调试**:说明如何启动jbpm服务,部署流程定义,以及如何在运行时监控和调试流程实例。 6. **API使用**:介绍jbpm提供的Java API,包括ProcessEngine、RepositoryService、TaskService等,以及如何在代码...
JBPM是一个强大的工作流引擎,它支持BPMN 2.0标准,允许开发者用图形化的方式定义复杂的业务流程。它提供了一个全面的工具集,包括流程建模、部署、执行、监控和分析等。JBPM不仅支持业务规则的集成,还能够与各种...
5. **服务调用**:能够无缝集成外部服务,如 Web Services 或 EJB,实现业务流程的跨系统交互。 6. **任务管理**:提供了用户友好的任务分配和管理界面,便于用户跟踪和处理任务。 7. **监控与日志**:提供详细的...
4. **集成能力**:jbpm可与Java EE、Spring等框架无缝集成,也可以与各种企业服务,如EJB、Web服务等进行交互,提供灵活的扩展性。 5. **任务管理**:jbpm提供任务服务,允许用户分配、接收、完成和转移任务,支持...
### jBPM 4.4版本更新概览与关键特性 #### 一、jBPM 4.4发行说明及文档资源 jBPM(Java Business Process Model)是一款开源的工作流引擎,它允许用户设计、执行和管理业务流程。jBPM 4.4版本的发行说明提供了一...
1. **工作流引擎**:jBPM的核心是一个强大的工作流引擎,能够执行基于BPMN 2.0标准的工作流定义。BPMN是一种图形化表示法,用于描述业务流程,包括任务、决策、事件和流程分支等元素。 2. **Guvnor**:Guvnor是jBPM...
此外,它还展示了jbpm的人力任务服务,即如何与用户交互处理流程中的任务。 在深入研究jbpm4.4-demo时,你将学习到如何使用jbpm提供的API和工作流服务,如流程实例的启动、任务的领取和完成、流程变量的获取和修改...