OSWorkflow的一些应用经验
OSWorkflow是一个值得在企业应用里使用的工作流开源产品。灵活性是可以使用的最大理由,因为小巧而强大,开源可扩展,性能可自行调整,它适应中国各个组织里流程的各种特殊性。因为要充分估计流程的复杂性,要适应流程的特殊性,所以要做好软件最好能够自己控制软件的依赖软件——工作流引擎。OSWorkflow的一些应用经验试图说明在实际应用中的一些使用经验
OSWorkflow的特性
l 业界优秀的开源工作流产品、可扩展性好
l 灵活性好、API可自行开发,只有几个数据库表
l 拥有独立的流程设计器
l 作为嵌入式的流程引擎甚至可以支持流程与应用的事务一致性
l 支持分支和合并流程
l 采用嵌入式集成,且开放源代码,性能可自行调整
l 支持流程图显示
l 支持流程期限
OSWorkflow的Designer流程设计器使用
l 新建流程workflow
l 新建人机交互或自动步骤step(自动的在action中加入auto="true")
l 新建流程操作action,一个workflowentry包含多个step,一个step可包含多个action,一个action必须要有一个unconditional-result
l 编辑step步骤的转换条件,使用beanshell
l 指定流程步骤step的所有人owner(即角色)
l 指定流程的Attribute(wfName等)
l 指定流程步骤的到期日期due-date
l 指定流程操作action的Attribute(actionURL等)
OSWorkflow API的使用
l 发起流程:
Workflow wf =
new BasicWorkflow((String) session.getAttribute("username"));
long id = wf.initialize("example", 0, map);
l 执行流程操作
wf.doAction(id, action, Collections.EMPTY_MAP);
l 待办列表获取
WorkflowQuery queryLeft = new WorkflowQuery(WorkflowQuery.OWNER, WorkflowQuery.CURRENT,
WorkflowQuery.EQUALS, session.getAttribute("username"));
WorkflowQuery queryRight =
new WorkflowQuery(WorkflowQuery.STATUS, WorkflowQuery.CURRENT, WorkflowQuery.EQUALS, "Underway");
WorkflowQuery query =
new WorkflowQuery(queryLeft, WorkflowQuery.AND, queryRight);
List workflows = wf.query(query);
l 已办列表获取
l 工作流查询
l 挂起流程
l 恢复流程
l 中止流程
l 流程指派
l 流程办理清单
l 流程图展示
l 待办列表获取问题
1. 如果要支持角色的工作列表获取,去掉os_currentstep与os_user的外键约束,去掉os_historystep与os_user的外键约束,为工作流适配器增加“public List getTasksForRole(String user, String status) throws StoreException”;
在定义workflow的xml文件里owner定义为user的group
2. 接收owner等于操作人的待办任务,即每次发起流程和执行流程操作时都选择下一步骤的接收人owner
l transientVars和propertySet的用法
propertySet为持久性属性,即读写数据库;transientVars只是瞬时地参数获取。时限设置:due-date
<initial-actions> <action id="0" name="启动工作流"> <pre-functions> <function type="beanshell"> <arg name="script"><![CDATA[ String caller = context.getCaller(); propertySet.setString("caller", caller); System.out.println(transientVars.get("shenpi")); System.out.println(transientVars.get("invoice")); propertySet.setString("shenpi", (String)transientVars.get("shenpi")); propertySet.setString("invoice", (String)transientVars.get("invoice")); System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); ]]></arg> </function> </pre-functions> <results> <unconditional-result id="5" old-status="Finished" status="Queued" step="1" owner="foos" due-date="3600000"/> </results> </action> </initial-actions> |
附一个实际应用的osworkflow工作流模板