流程生命周期
持久化(保存流程定义)
转移至PE,并启动
运行
结束
Pe数据库介绍
流程运行的数据和状态保存在数据库中。
PE数据库默认名称为VWDB,表名已VW开头
每个节点的解析有三个方面
工作区中的操作
VWDB数据库相应的数据和变化
工作区中的操作:
启动工作流,需要设置Subject,comments,可以通过检索查询
VWWorkObject表示工作项,工作项分为根工作项、一般工作项
根工作项:存放的是工作流实例的基本信息
判断根工作项和一般工作项的依据是:F_WobNum = F_WorkFlowNumber
单词participant参与者
节点执行后数据库的变化
目标节点只有一个用户的情况:一个工作项记录插入到 user queue表
目标节点多个用户的情况:一个工作项记录插入到 user queue表和VWRoster表
目标节点时一个workQueue的节点,工作项插入到checkers工作队列所对应的workqueue表
总结:所有的工作记录都在VWQueue表中(user queue或work queue),但并不是所有工作项记录都在VWRoster表中,所有根工作项记录都在VWRoster表中,而非VWQueue表。
查找工作项常见的三中需求:
1 查看某个用户收件箱的待办工作项。
清单 4. 查看 mark 的收件箱
public void testListUserInboxWorkItems() throws VWException {
String userName = "mark";
String[] queueNames = vwSession.fetchQueueNames(
VWSession.QUEUE_USER_CENTRIC);
for (int i = 0; i < queueNames.length; i++) {
String queueName = queueNames;
VWQueue vwQueue = vwSession.getQueue(queueName);
int queryFlags = VWQueue.QUERY_READ_LOCKED;
if (queueName.startsWith("Inbox(")) {
VWQueueQuery qQuery = vwQueue.createQuery(
null, null, null, queryFlags, null, null,
VWFetchType.FETCH_TYPE_WORKOBJECT);
while (qQuery.hasNext()) {
VWWorkObject workObject = (VWWorkObject) qQuery.next();
VWParticipant participant = workObject.getParticipantNamePx();
if (participant != null & userName.equals(participant.getParticipantName()))
{
printNormalWorkObject(workObject);
}
}
}
}
}
private void printNormalWorkObject(VWWorkObject workObject) throws VWException {
System.out.println("\t*****************************");
System.out.println("\tWork Object Number: " + workObject.getWorkObjectNumber());
System.out.println("\tWork Object Subject: " + workObject.getSubject());
System.out.println("\tWorkflow Name: " + workObject.getWorkflowName());
System.out.println("\tWorkflow Number: " + workObject.getWorkflowNumber());
System.out.println("\tWorkflow Map Name: " + workObject.getCallMap());
System.out.println("\tWorkflow Step Name: " + workObject.getStepName());
System.out.print("\tAll Data Fields: ");
VWDataField[] dataFields = workObject.getDataFields(
VWWorkObject.FIELD_USER_AND_SYSTEM_DEFINED,
VWWorkObject.FIELD_USER_AND_SYSTEM_DEFINED);
printDataFields(dataFields);
}
2 检查某个工作队列的待办工作项
public void testListWorkQueueWorkItems() throws VWException {
String workQueueName = "Checkers";
String[] queueNames = vwSession.fetchQueueNames(VWSession.QUEUE_PROCESS);
for (int i = 0; i < queueNames.length; i++) {
String queueName = queueNames;
VWQueue vwQueue = vwSession.getQueue(queueName);
int queryFlags = VWQueue.QUERY_READ_LOCKED;
if (workQueueName.equals(queueName)) {
VWQueueQuery qQuery = vwQueue.createQuery(
null, null, null, queryFlags, null, null,
VWFetchType.FETCH_TYPE_WORKOBJECT);
while (qQuery.hasNext()) {
VWWorkObject workObject = (VWWorkObject) qQuery.next();
printNormalWorkObject(workObject);
}
}
}
}
*********************************************************
3 一个流程实例当前的待办工作项。
F_WobNum – 工作项号(对于根工作项,它的值和 F_WorkFlowNumber 相同 )
F_WorkFlowNumber – 工作流实例号
F_Class – 转移至 PE 中的工作流定义名
F_WorkClassId – 转移至 PE 中的工作流定义 ID
F_InstrSheetId – 工作流定义中的图 (Map) 定义 ID
F_WorkOrderId – 图定义中的节点定义 ID
F_Locked – 工作项是否被加锁
工作项内容查看----工作区操作:
在工作区查看工作项内容有两种方式:
1 只读性质的查看工作项内容:通过点击工作项名称旁边的“get info for..”按钮。
2 可编辑性质的打开工作项,直接点击工作项名称的连接
说明:只读不会加锁,可编辑性质工作项加锁
数据库:从数据库直接查看工作项信息比较复杂。
解锁工作项:有两种方式
1 打开它的用户通过cloas按钮关闭编辑界面或点击complete按钮完成它
2 点击“get info for ***”按钮,会弹出任务信息界面,然后再改页面对工作项重新分配或移动操作
数据库:从数据库直接查看工作项信息比较复杂。
不建议直接修改数据库数据的方式来给工作项加锁解锁
代码:
查看锁状态通过查看VWWorkObject与锁有关的数据字段:F_Locked F_LockUser等,可以调用VWWorkObject的FetcheLockedStatus、getLockedUser方式实现。
加锁、解锁通过调用VWWorkObject的doLock和doSave方法来实现
工作项内容编辑
工作区操作:只需要打开它并进行编辑,编辑完成后,点击apply按钮保存修改,或close按钮取消修改,
说明:编辑工作项不会导致它的完结,编辑工作项与重新分配和返回工作项操作结合实现多位用户依次在一个工作项上工作,最终由一个用户完成它。
数据库:不建议通过直接修改数据库数据的方式来编辑工作项内容
代码:通过调用 VWWorkObject 的 setComment 或 setSelectedResponse 等方法来改变工作项内容,然后通过调用 doSave 方法保存修改。
完成 (Complete) 工作项:
工作区操作:打开工作项,无论是否编辑都可以通过点击“complete”按钮来实现。完成工作项首先会自动保存对它的编辑
数据库变化:当一个数据项被完成后,它对应的数据库记录会在VWRoster和/或VWQueue表中删除。
代码:通过调用VWWorkObject的doDisspatch方法完成工作项。
移动和返回工作项
工作区操作:将工作收件箱的工作项移动到你个人的收件箱,其他人就不能对该工作项进行操作。
在个人收件箱的工作项如果来自公共收件箱,可以返回到原来工作项里。
数据库变化:移动操作导致相应的工作项记录从WorkQueue表删除并插入到User queue表中,返回相反
代码:VWWorkObject的doReassign和doReturnToSource方法实现工作项的移动与返回。
重新分配Reassign与返还工作项return
工作区操作:一个工作项重新分配给其他用户编辑或完成。
返还别人重新分配的工作项,操作类似于返还移动过的工作项。
数据库变化:工作项记录中与用户相关的数据字段有改动
对于重新分配操作,如果源工作项在工作收件箱中,则相应工作项记录从work queue表中删除并插入到user queue,返还操作相反。
代码:通过调用VWWorkObject的doReassign和doReturnToSource方法实现工作项的重新分配和返还。
流程结束
工作区操作:当一个流程实例走完所有的节点,就结束
数据库变化:流程实例的根工作项记录从VWRoster表中删除
代码:
显示工作流定义
工作区操作:找到流程设计文件,点击流程名称,进入流程设计器界面
数据库变化:工作流定义没有保存在数据库中,而是保存在CE以及内容中。
代码:工作流定义被转移至PE中之后,可以通过PE API来访问它
public void testPrintTransferredWorkflowDefinition() throws VWException {
String workClassName = "SampleParticipantFlow";
VWWorkflowDefinition workflowDef = vwSession.fetchWorkflowDefinition(
-1, workClassName, true);
VWMapDefinition[] maps = workflowDef.getMaps();
for (int i = 0; i < maps.length; i++) {
VWMapDefinition map = maps;
System.out.println("\t***********************************");
System.out.println("\tMap Name: " + map.getName());
System.out.println("\tMap ID: " + map.getMapId());
VWMapNode[] steps = map.getSteps();
for (int j = 0; j < steps.length; j++) { VWMapNode step = steps[j];
System.out.println("\t\tStep Name: " + step.getName());
System.out.println("\t\tStep ID: " + step.getStepId()); } }
}
*******************************************************
Map Name: Malfunction Map ID: -4 Step Name: StartStep Step ID: 0
Step Name: Review Step ID: 1 Step Name: Return Step ID: 3
*******************************************************
Map Name: Terminate Map ID: -3 Step Name: StartStep Step ID: 0
*******************************************************
Map Name: Workflow Map ID: -2 Step Name: LaunchStep
Step ID: 0 Step Name: ParticipantStep Step ID: 3
正在运行的流程实例的历史信息
工作区操作:打开流程管理器或流程跟踪器来查看正在运行(未结束)的工作流实例的历史信息。
数据库变化:查看VWLog表中的数据
代码:
相关java类简介
1VWProcess – 用于访问运行中的工作流实例的信息,如状态,活动工作项,历史信息等。
2VWWorkflowHistory – 用于访问一个正在运行的工作流实例的某个图 (Map) 的历史信息。
3VWStepHistory – 零或多个 VWStepHistory 实例可以从一个 VWWorkflowHistory 实例得到。一个 VWStepHistory 实例用于访问一个工作流实例的某个节点的历史信息。
4VWStepOccurrenceHistory– 零或多个 VWStepOccurrenceHistory 实例可以从一个 VWStepHistory 实例得到。一个VWStepOccurrenceHistory 实例用于访问一个工作流节点的一次发生(occurrence),这个节点可能已经完成了,也可能正在运行。一次发生意味着工作流实例运行到达该节点一 次。当发生完成时,工作流实例继续向下一个节点前进。
5VWStepWorkObjectHistory – 零或多个VWStepWorkObjectHistory 实例可以从一个 VWStepOccurrenceHistory 实例得到。一个VWStepWorkObjectHistory 实例用于访问一个相应节点产生的工作项,这个工作项可能已经完成,也可能正在等待处理。
6VWParticipantHistory– 零或多个 VWParticipantHistory 实例可以从一个 VWStepWorkObjectHistory 实例得到。一个VWParticipantHistory 实例用于访问一个参与者 (participant)在相应工作项上的活动。一个工作项可能有多位用户先后参与编辑和完成,例如在它被重新分配,甚至多重重新分配的情况下。
工作流事件日志:EventLog
工作区操作:打开流程管理器查询工作流实例在PE的事件日志,工作流实例可以使正在运行也可以使已经结束。
数据库变化:查看 VWLog 表中的数据
代码: