一、 概念
相对PageFlow(页面流)由同一用户与系统之间的一系列交互完成一项任务不同,Business Process Management(工作流)的范围更宽,它包含一系列相关任务,这些任务一般由不同人在不同时间完成。
Seam对jbpm的集成的方便性我认为表现在三个方面:
1. 提供内置对象显示任务列表给用户;
2. 前文曾提到seam除新增conversation上下文外,还新增了business_ process上下文,这就是为工作流管理提供的,应用程序可以将流程中涉及的相关状态作为jbpm变量存储于business process上下文,然后seam可以持久化这些jbpm变量;
3. 提供方便的标签开始一个流程,开始一个任务、结束一个任务。
二、 用法
下面我还是用一个示例讲述工作流的用法,这个示例是一个客户订单审批的例子:客户在网上提交一个订单后,开始订单审批流程;经理查看任务列表,接收订单,查看订单明细信息,根据情况批准或不批准此订单。
1. 流程定义
流程图:
(见附件)
Jpdl文件:
(见附件) <process-definition name="订单管理"></process-definition>
2. 初始化actor ids
Jbpm对流程中用户的管理是通过actor id和group actor ids.为此seam内置了一个部件Actor来方便指定当前的actor ids.这个工作一般在用户登陆时完成。
@In(create=true) Actor actor
…
Public String login(){
…
Actor.setId(user.getUserName());
Actor.getGroupActorIds().addAll(user.getGroupNames());
…
}
3. 启动一个工作流
@out(scope=ScopeType.BUSINESS_PROCESS,required=false)
Long orderId;
@Out(scope=ScopeType.BUSINESS_PROCESS,required=false)
Float amount;
@Out(value=”customer”,scope=ScopeType.BUSINESS_PROCESS,required=false)
String customerName;
@CreateProcess(definition="OrderManagement")
public void submitOrder() {
try {
completedOrder = purchase(customer, currentOrder);
orderId = completedOrder.getOrderId();
amount = completedOrder.getNetAmount();
customerName = completedOrder.getCustomer().getUserName();
} catch (InsufficientQuantityException e) {
…
} catch (Throwable t) {
…
}
}
4. 任务分配
当开始一个工作流的时候,任务实例被创建,任务实例必须分配给一个用户或用户组,相应seam中分配任务有二种方式—分配给用户或用户组,如:
分配给用户:
<task description="ship order" name="ship"></task>(见附件)
<assignment actor-id="#{ shipperAssignment.actorId}"></assignment>
分配给用户组:
<task description="Ship order" name="ship"></task>(见附件)
<assignment pooled-actors="#{shipperAssignment.pooledActors}"></assignment>
5. 任务列表
有两个内置的seam部件方便显示任务列表—一个是显示分配给组用户的任务,一个是显示分配给当前用户的指定类型的任务。
显示分配给当前用户的指定类型的任务示例如下:
<h:datatable var="task" value="#{taskInstanceListForType['ship']}">
(见附件)<h:column> </h:column>
</h:datatable>
显示分配给当前用户所属组的任务示例如下:
<h:datatable var="task" value="#{pooledTaskInstanceList}">(见附件)<h:column> </h:column>
<h:column>
<s:link value="Assign" action="#{pooledTask.assignToCurrentActor}" taskinstance="#{task}" linkstyle="button">
</h:column>
</h:datatable>
6. 开始任务
Seam提供了两个标注开始任务:@StartTask和@BeginTask.开始任务时开始一个conversation上下文,能在其中访问保存在business process上下文中的变量。
@BeginTask
public String viewTask() {
order = (Order) em.createQuery("select o from Order o join fetch o.orderLines where o.orderId = :orderId")
.setParameter("orderId", orderId)
.getSingleResult();
return "accept";
}
7. 结束任务
Seam提供@EndTask标注结束任务,并指明下一步流程。如:
@EndTask(transition="approve")
public String accept() {
order.process();
return "admin";
}
8. 系统配置
和配置pageflow类似,seam在component.xml文件中配置JBPM.
<component class="org.jboss.seam.core.Jbpm">(见附件) </component>