- 浏览: 133213 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
newhxj:
03-21 10:56:35.850: E/Web Conso ...
Android简易Flash播放器[转] -
roiz:
谢谢 很好正需要这资料
精确监听AbsListView滚动至底部[转]
一、流程定义
1.部署流程定义
ProcessEngine processEngine = new Configuration().buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
例:布署文件中的流程
//布署当前目录下pd.jpdl.xml文件
String deploymentId = repositoryService.createDeployment()
.addResourceFromClasspath("pd.jpdl.xml").deploy();
例:布署网页上TextArea中的流程
<form action="jbpm?family168=deploy" method="post">
<textarea name="xml" cols=50 rows=15></textarea>
<input type="submit" value="发布"/>
<input type="reset" value="取消"/>
</form>
在后台处理如下:
String xml = request.getParameter("xml");
repositoryService.createDeployment()
.addResourceFromString("process.jpdl.xml", xml).deploy();
2.删除流程定义
类ProcessDefinition 包含如下属性:
ID:流程定义ID号
DeploymentId:流程定义的布署ID号
Key:关键字
name:流程名
version:版本号
数据如下
ID Key 名称 版本
hello-1 hello hello 1
//获取类ProcessDefinition的属性ID
String id = request.getParameter("id");
//根据流程ID获取流程定义实例
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(id).uniqueResult();
//根据流程定义的布署ID号,删除该流程定义
//注意:jbpm4是不允许直接根据流程定义的ID来直接删除流程定义的,因为还要删除其它配置数据
repositoryService.deleteDeploymentCascade(pd.getDeploymentId());
3.获取全部流程定义
根据流程名获取所有流程定义
List<ProcessDefinition> processDefinitions = repositoryService
.createProcessDefinitionQuery().orderAsc( ProcessDefinitionQuery.PROPERTY_NAME).list();
还可以根据以下顺序进行排序(org.jbpm.api.ProcessDefinitionQuery)
public static final java.lang.String PROPERTY_DEPLOYMENT_TIMESTAMP "deployment.timestamp"
public static final java.lang.String PROPERTY_ID "idProperty.stringValue"
public static final java.lang.String PROPERTY_KEY "keyProperty.stringValue"
public static final java.lang.String PROPERTY_NAME "idProperty.objectName"
public static final java.lang.String PROPERTY_VERSION "versionProperty.longValue"
二、流程实例
1.启动一个流程实例
1.1根据key启动流程实例
用户必须为新启动的流程实例分配一个key, 这个key是用户执行的时候定义的且唯一。通常在业务流程领域找到这种key。 比如,一个订单id或者一个保险单号。
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL", "CL92837");
key可以用来创建流程实例的id, 格式为{process-key}.{execution-id}。 所以上面的代码会创建一个id为 ICL.CL92837的流向 (execution)。
1.2根据数据库主键启动流程实例
如果没有提供用户定义的key,数据库就会把主键作为key。 这样可以使用如下方式获得id:
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL");
String pid = processInstance.getId();
最好使用一个用户定义的key。提供给一个用户定义的key, 你可以组合流向的id,而不是执行一个基于流程变量的搜索 - 那种方式太消耗资源了。
1.3根据变量启动流程实例
为一个新的流程实例启动时就提供一组对象参数。 将这些参数放在variables变量里, 然后可以在流程实例创建和启动时使用。
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 processInstance = executionService.startProcessInstanceByKey("ICL", variables);
参见流程定义4-1,把order作为一个流程变量分配给它,启动新流程实例代码如下:
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("order", new Order("johndoe"));
ProcessInstance processInstance = executionService.startProcessInstanceByKey("TaskAssignee", variables);
2.根据流程定义,查看流程实例
根据类ProcessDefinition
的属性ID,查看该流程的所有实例
String pdId = request.getParameter("id");
return executionService.createProcessInstanceQuery()
.processDefinitionId(pdId).list();
3.执行实例
根据类ProcessInstance
的属性ID,执行流程实例
String pid = request.getParameter("pid");
executionService.signalExecutionById(pid);
四.任务
假设流程定义4-1如下:
<process name="TaskAssignee">
<start>
<transition to="review" />
</start>
<task name="review" assignee="#{order.owner}">
<transition to="work" />
</task>
<task name="review" assignee="johndoe
">
<transition to="wait" />
</task>
<state name="wait"/>
</process>
assignee="johndoe"
表示任务会被分配给用户ID为"johndoe"的人。
assignee="#{order.owner}"
任务被分配给#{order.owner}。表示通过Order对的getOwner()方法会用来获得用户id,该用户负责完成这个任务。
public class Order implements Serializable {
String owner; public Order(String owner) {
this.owner = owner;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
}
1.获取任务列表
1.1根据用户ID获取任务列表
List<Task> taskList = taskService.findPersonalTasks("johndoe");
1.2根据任务候选人或候选组获取任务列表
任务可能被分配给一组用户。 其中的一个用户应该接受这个任务并完成它。
candidate-groups:一个使用逗号分隔的组id列表。 所有组内的用户将会成为这个任务的候选人。
candidate-users:一个使用逗号分隔的用户id列表。 所有的用户将会成为这个任务的候选人。
例如:
<task name="review" candidate-groups="sales-dept">
<transition to="wait" />
</task>
假设:sales-dept有两个成员:johndoe和joesmoe
这个任务被创建时,不显示在任何人的个人任务列表中。 下面的任务列表会是空的。
taskService.getAssignedTasks("johndoe");
taskService.getAssignedTasks("joesmoe");
分组任务列表中,用户接口必须只接受对这些任务的“接受”操作。
taskService.takeTask(task.getDbid(), "johndoe");
当一个用户接受了一个任务,这个任务的分配人就会变成当前用户。任务会从所有候选人的分组任务列表中消失,它会出现在用户的已分配列表中。
1.3在一个列表中显示该某人的所有任务
包括他的个人任务,候选任务,这时直接用jbpm4提供的api完成不了该功能要求。于是可以使用以下方式进行扩展:
/**
* 取得用户的对应的任务列表
* @param userId
* @return
*/
public List<TaskImpl> getTasksByUserId(String userId){
AppUser user=(AppUser)getHibernateTemplate().load(AppUser.class, new Long(userId));
Iterator<AppRole> rolesIt=user.getRoles().iterator();
StringBuffer groupIds=new StringBuffer();
int i=0;
while(rolesIt.hasNext()){
if(i>0)groupIds.append(",");
groupIds.append("'"+rolesIt.next().getRoleId().toString()+"'");
}
/**
* select * from `jbpm4_task` task
left join jbpm4_participation pt on task.`DBID_`=pt.`TASK_`
where task.`ASSIGNEE_`='1' or ( pt.`TYPE_` = 'candidate' and (pt.`USERID_`='1')
or pt.`GROUPID_`in ('1'))
*/
StringBuffer hqlSb=new StringBuffer();
hqlSb.append("select task from
org.jbpm.pvm.internal.task.TaskImpl task left join task.participations
pt where task.assignee=?");
hqlSb.append(" or (pt.type = 'candidate' and ((pt.userId=?)");
if(user.getRoles().size()>0){
hqlSb.append(" or (pt.groupId in ("+groupIds.toString()+"))");
}
hqlSb.append("))");
hqlSb.append(" order by task.priority desc");
return findByHql(hqlSb.toString(), new Object[]{userId,userId});
}
2分配任务
如果在流程定义文件中将任务指定到了个人,则jbpm自动分配给个人。否则需要进行指定
2.1给用户组的用户分配任务
流程定义文件:
<task name="review" candidate-groups="sales-dept">
<transition to="wait" />
</task>
假设:sales-dept有两个成员:johndoe和joesmoe
分组任务列表中,用户接口必须只接受对这些任务的“接受”操作。
taskService.takeTask(task.getDbid(), "johndoe");
当一个用户接受了一个任务,这个任务的分配人就会变成当前用户。任务会从所有候选人的分组任务列表中消失,它会出现在用户的已分配列表中。
2.2任务分配处理器分配任务
一个AssignmentHandler可以通过编程方式来计算 一个任务的分配人和候选人。
public interface AssignmentHandler extends Serializable {
void assign(Assignable assignable, OpenExecution execution) throws Exception;
}
Assignable是任务和泳道的通用接口。 所以任务分配处理器可以使用在任务, 也可以用在泳道中。
包含任务分配处理器的流程定义4-2如下:
<process name="TaskAssignmentHandler" xmlns="http://jbpm.org/4.2/jpdl">
<start g="20,20,48,48">
<transition to="review" />
</start>
<task name="review" g="96,16,127,52">
<assignment-handler class="org.jbpm.examples.task.assignmenthandler.AssignTask">
<field name="assignee">
<string value="johndoe" />
</field>
</assignment-handler>
<transition to="wait" />
</task>
<state name="wait" g="255,16,88,52" />
</process>
类AssignTask代码如下:
public class AssignTask implements AssignmentHandler {
String assignee;
public void assign(Assignable assignable, OpenExecution execution) {
assignable.setAssignee(assignee);
}
}
请注意,默认AssignmentHandler实现可以使用使用流程变量,任何其他Java API可以访问资源,像你的应用数据库来计算分配人和候选人用户和组。
启动一个TaskAssignmentHandler的新流程实例,会立即让新流程实例运行到任务节点。
一个新review任务被创建,在这个时候 AssignTask的分配处理器被调用。这将设置johndoe为分配人。 所以John
Doe将在他自己的任务列表中找到这个任务。
2.3给泳道分配任务
任务泳道如下面的流程文件4-3:
<process name="TaskSwimlane" xmlns="http://jbpm.org/4.2/jpdl">
<swimlane name="sales representative" candidate-groups="sales-dept" />
<start>
<transition to="enter order data" />
</start>
<task name="enter order data" swimlane="sales representative">
<transition to="calculate quote"/>
</task>
<task name="calculate quote" swimlane="sales representative">
</task>
</process>
在这个例子中,我们在身份组件中 创建了下面的信息:
identityService.createGroup("sales-dept");
identityService.createUser("johndoe", "johndoe", "John", "Doe");
identityService.createMembership("johndoe", "sales-dept");
在启动一个新流程实例后,用户johndoe将成为 enter order data的一个候选人。还是像上一个流程候选人例子一样, John Doe可以像这样接收任务:
taskService.takeTask(task.getDbid(), "johndoe");
接收这个任务将让johndoe成为任务的负责人。 直到任务与泳道sales representative关联, 分配人johndoe也会关联到泳道中作为负责人。接下来,John Doe可以像下面这样完成任务:
taskService.completeTask(taskDbid);
完成任务会将流程执行到下一个任务, 下一个任务是calculate quote。 这个任务也关联着泳道。因此, 任务会分配给johndoe。
发表评论
-
Java基于Socket文件传输示例[转]
2012-11-21 17:58 757最近需要进行网络传输大文件,于是对基于socket的文件传输作 ... -
Java基础:三步学会Java Socket编程3[转]
2012-11-21 17:17 859第三步 实现信息共享:在Socket上的实时交流 网络的 ... -
Java基础:三步学会Java Socket编程2[转]
2012-11-21 17:15 742第二步 多个客户同时连接 在实际的网络环境里,同一时间只 ... -
Java基础:三步学会Java Socket编程1[转]
2012-11-21 17:12 875第一步 充分理解Socket ... -
一步步优化JVM七:其他[转]
2012-11-10 23:37 1090边缘问题 在某 ... -
一步步优化JVM六:优化吞吐量[转]
2012-11-07 00:23 7102如果你已经进行 ... -
一步步优化JVM五:优化延迟或者响应时间(3)[转]
2012-11-07 00:20 6711CMS垃圾回收器周期 一旦young的空 ... -
一步步优化JVM五:优化延迟或者响应时间(2)[转]
2012-11-07 00:13 1617优化CMS(concurrent garbage col ... -
一步步优化JVM五:优化延迟或者响应时间(1)[转]
2012-11-06 23:35 1144本节的目标是做 ... -
一步步优化JVM四:决定Java堆的大小和内存占用[转]
2012-11-06 19:21 1215到目前为止,还没有做明确的优化工作。只是做了初始 ... -
一步步优化JVM三:GC优化基础[转]
2012-11-06 18:52 1172本节主要描述关于垃圾回收器性能的三个指标,三 ... -
一步步优化JVM二:JVM部署模型和JVM Runtime[转]
2012-11-06 18:27 1250选择JVM部署模型 JVM部署模型的选择总体来说 ... -
一步步优化JVM(一)——概述[转]
2012-11-06 18:04 1268现代JVM是一个具有灵活适应各种应用能力的软件,尽 ... -
Filter的用法[转]
2012-10-03 22:01 874filter过滤器主要使用于前台向后台传递数据是的过滤操 ... -
Spring Aop 日志管理[转]
2012-07-14 01:54 1841Spring Aop 日志管理 Sp ... -
Spring中的用于格式化的annotation[转]
2012-06-28 21:51 2036转至http://linksc.iteye.com/blog/ ... -
Hibernate的ID生成策略/联合主键解决方案[转]
2012-06-27 00:22 884转至http://blog.163.com/fengz ... -
HibernateTemplate Callback 2
2012-06-26 23:46 707package com.bee.common.hiber ... -
HibernateTemplate Callback
2012-06-26 23:45 844package com.bee.common.hiber ... -
Spring管理Hibernate事务[转]
2012-06-26 22:56 8581.TransactionProxyFactoryBean ...
相关推荐
Jbpm4常用操作 Jbpm4是Java流程管理系统(Java Business Process Management System),它提供了一种基于工作流的方式来定义、执行和管理业务流程。下面是Jbpm4常用操作的详细说明: 一、流程定义 流程定义是Jbpm...
### JBPM4 常用表结构及其说明 JBPM4是JBPM(Java Business Process Model)的一个版本,主要用于提供业务流程管理的功能。它通过一组数据库表来支持工作流的执行与跟踪。本文将详细介绍JBPM4中的常用表结构及其...
在运行此脚本之前,你需要有SQL Server环境,并确保拥有足够的权限来执行DDL操作。 3. **Sybase脚本(jbpm.jpdl.sybase.sql)**:Sybase是另一款企业级的关系型数据库系统,尤其在金融领域有广泛应用。jbpm.jpdl....
在"jbpm-常用的所有jar包"中,我们通常会看到一系列的jar文件,这些文件包含了jbpm框架运行所需的核心组件和依赖库。以下是一些主要的jar包及其功能: 1. **jbpm-flow.jar**:这是jbpm的主要流程引擎,包含了流程...
jbpm是一个开源的工作流引擎,可以处理复杂的业务流程自动化,而SSH是Java开发中常用的技术栈,提供了MVC架构、依赖注入和对象关系映射等功能。 在进行jbpm与SSH框架的集成时,首先要确保环境的正确搭建。这里以...
3. **集成IDE**:常用IDE如Eclipse或IntelliJ IDEA,可以通过插件集成jBPM开发工具,便于流程设计和调试。 **三、jBPM4.4流程建模** 1. **使用BPMN编辑器**:通过图形化界面设计流程图,包括任务、网关、事件等...
SSH是Java Web开发中常用的三大组件:Struts2负责控制层,提供MVC设计模式的实现;Spring作为应用框架,提供依赖注入(DI)和面向切面编程(AOP),以及服务层管理;Hibernate则作为一个对象关系映射(ORM)工具,...
5. **注解使用**:掌握Java注解的基本用法,理解jbpm中常用注解的含义和作用,如@ProcessDefinition、@TaskListener等。 6. **数据库和持久化**:了解jbpm如何与数据库交互存储流程实例和任务信息,以及如何配置和...
- **事务管理**:Spring的事务管理器可以与JBPM的事务管理相结合,确保流程操作的原子性和一致性。 - **AOP集成**:Spring的AOP可以在流程执行的关键点添加拦截器,实现日志记录、权限检查等功能。 - **Bean管理**:...
活动(Activity)**:活动是工作流中的基本单元,它可以是任何类型的操作,如人工任务、自动任务或子流程等。每个活动都有自己的状态,例如等待、运行中或已完成。 **3. 转移(Transition)**:转移定义了活动之间...
流程定义文件使用BPMN(Business Process Model and Notation)标准,它是业务流程建模的常用语言。 学习这个示例,你需要掌握以下知识点: 1. **BPMN标准**:了解基本的BPMN元素,如开始事件、结束事件、用户任务...
SSH(Spring、Struts2和Hibernate)是Java Web开发中常用的三大框架,它们分别负责不同的职责。Spring作为全能型框架,提供了依赖注入、AOP(面向切面编程)、事务管理等功能,使得代码更加模块化和松耦合。Struts2...
- **使用Helper方法**: 介绍了一些常用的测试辅助方法。 - **断言**: 如何使用断言来验证流程行为。 - **调试**: 如何利用提供的工具进行流程调试。 - **流程实例视图**: 查看流程实例的执行情况。 - **人工任务视图...
SSH(Struts2、Spring、Hibernate)是Java开发中常用的三大开源框架,它们各自负责Web层、业务层和持久层的管理,而JBPM则是一个强大的工作流管理系统,主要用于处理业务流程。将SSH与JBPM整合,可以让开发者更加...
- **流程定义(Process Definition)**: BPMN(Business Process Model and Notation)是JBPM常用的过程定义语言,用于创建可视化的工作流模型。 - **实体(Entities)**: 包括流程实例(Process Instance)、任务...
Struts2、Spring、Hibernate和Jbpm是Java开发中常用的技术栈,它们结合在一起可以构建出高效、灵活的企业级应用。在这个“struts2+spring+hibernate+jbpm工作流实例”中,主要展示了如何利用这些技术实现一个公文...
(不常用) 3)decision 当需要在流程中根据不同条件来判断执行不同路径时,就可以用decision节点。两种方法:最简单的是在transitions里增加condition elements(条件),condition是beanshell script写的,它返回...
2. **SSH2**:SSH2代表Spring、Struts和Hibernate的集成,是Java Web开发中的常用三层架构。Spring提供了依赖注入、AOP(面向切面编程)、事务管理等;Struts是MVC(Model-View-Controller)架构的实现,负责处理...
通过Struts的Action类,我们可以定义特定的业务操作,这些操作可以调用jbpm4的工作流服务来启动、执行或结束流程实例。 2. **Spring框架**:Spring作为企业级应用的中心,提供了依赖注入(DI)和面向切面编程(AOP...