Oracle BPM,在设计流程图的时候使用Complex User Task,对应的Human Task在分配对象的时候会采用外部路由,即自定义分配实现。
自定义类要实现oracle.bpel.services.workflow.task.IAssignmentService接口,代码如下:
package dasproject;
/* $Header: TestAssignmentService.java 24-may-2006.18:26:16 Exp $ */
/* Copyright (c) 2004, 2006, Oracle. All rights reserved. */
/*
DESCRIPTION
Interface IAssignmentService defines the callbacks an assignment
service implements. The implementation of the IAssignmentService
is called by the workflow service
PRIVATE CLASSES
<list of private classes defined - with one-line descriptions>
NOTES
<other useful comments, qualifications, etc.>
MODIFIED (MM/DD/YY)
*/
/**
* @version $Header: IAssignmentService.java 29-jun-2004.21:10:35 Exp
$
*
*
*/
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import oracle.bpel.services.workflow.metadata.routingslip.model.*;
import oracle.bpel.services.workflow.metadata.routingslip.model.Participants;
import oracle.bpel.services.workflow.metadata.routingslip.model.ParticipantsType.*;
import oracle.bpel.services.workflow.task.IAssignmentService;
import oracle.bpel.services.workflow.task.ITaskAssignee;
import oracle.bpel.services.workflow.task.model.Task;
public class TestAssignmentService implements oracle.bpel.services.workflow.task.IAssignmentService {
static int numberOfApprovals = 0;
static String[] users = new String[] { "zhangsan", "dangan", "liangban" };
@Override
public Participants onInitiation(Task task, Map propertyBag) {
return createParticipant();
}
@Override
public Participants onReinitiation(Task task, Map propertyBag) {
return null;
}
@Override
public Participants onOutcomeUpdated(Task task, Map propertyBag,
String updatedBy, String outcome) {
return createParticipant();
}
@Override
public Participants onAssignmentSkipped(Task task, Map propertyBag) {
return null;
}
@Override
public List getAssigneesToRequestForInformation(Task task,
Map propertyBag) {
List rfiUsers = new ArrayList();
rfiUsers.add("jcooper");
rfiUsers.add("zhangsan");
rfiUsers.add("dangan");
rfiUsers.add("liangban");
return rfiUsers;
}
@Override
public List getReapprovalAssignees(Task task, Map propertyBag,
ITaskAssignee infoRequestedAssignee) {
List reapprovalUsers = new ArrayList();
reapprovalUsers.add("zhangsan");
reapprovalUsers.add("dangan");
reapprovalUsers.add("liangban");
return reapprovalUsers;
}
private Participants createParticipant() {
if (numberOfApprovals > 2) {
numberOfApprovals = 0;
return null;
}
String user = users[numberOfApprovals++];
ObjectFactory objFactory = new ObjectFactory();
Participants participants = objFactory.createParticipants();
Participant participant =
objFactory.createParticipantsTypeParticipant();
participant.setName("Loan Agent");
ResourceType resource2 = objFactory.createResourceType(user);
resource2.setIsGroup(false);
resource2.setType("STATIC");
participant.getResource().add(resource2);
participants.getParticipantOrSequentialParticipantOrAdhoc().add(participant);
return participants;
}
}
在流程项目属性上增加SOA Workflow的库依赖。
TestAssignmentService要放到SCA-INF/classes路径下。
编辑实现Complex User Task的Human Task对象,在Assignment的Tab页,设置class name为dasproject.TestAssignmentService。
发布流程项目,Complex User Task就会按照自定义类TestAssignmentService来分配任务给指定对象。
onInitiation方法,是指任务初始化的时候分配给谁。
onOutcomeUpdated方法,是指任务被更新结果的时候分配给谁。
getAssigneesToRequestForInformation方法,是指用户请求信息的时候参与方有哪些人。