- 浏览: 516349 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ben_wu007:
没数据库设计 而且这样要写代码 还是做成配数据库好 ...
使用AOP做权限控制 -
邢邢色色:
支持楼主,但这本书没有讲trident,有些过时了~到amaz ...
《Storm入门》中文版 -
java_web_hack1:
我在FunctionProvider中,获取的Property ...
在Osworkflow中使用PropertySet存储业务数据 -
greemranqq:
腾飞 ~。~
Java并发和多线程译者征集 -
fantasy:
leonevo 写道hi, 我也在设计cmdb. 我觉得基于传 ...
ITSM-CMDB数据库设计-四种方案任你选
基本开发思路
一个流程:
也可以作为Spring的Bean配置出来。
WorkflowService用于提供工作流引擎的基础服务。
所有业务流程service必须继承它。
此类不能直接提供给外部使用。
Workflow类,在这里你可以设置流程的执行者。
AbstractFunction类,所有Function的基类,继承他能得到很多工作流引擎自带的基础属性。如调用者,流程ID..等
使用自定义的condition来实现,用自己的权限系统控制流程
一些内置的condition
一个流程:
- 一个业务流程service,用于定义流程的名称及初始化执行ID。(如下PolicyWorkflowService )
- 一个流程定义文件。
- N个condition(用于做权限限制)。
- N个function(用于执行业务函数)。
public class PolicyWorkflowService extends WorkflowService { public static String WORKFLOW_NAME = "policy"; public static int INITIALIZE_ACTION_ID = 100; public PolicyPublishWorkflowService() { super(WORKFLOW_NAME, INITIALIZE_ACTION_ID); } }
也可以作为Spring的Bean配置出来。
WorkflowService用于提供工作流引擎的基础服务。
所有业务流程service必须继承它。
此类不能直接提供给外部使用。
/** * 工作流程服务类 * * @author kiral * @日期 2008-1-15 */ public class WorkflowService{ public static final Logger logger = Logger.getLogger(WorkflowService.class); private String workflowName; private Workflow workflow; private int initActionId; protected WorkflowService() { } protected WorkflowService(String workflowName, int initActionId) { this.workflowName = workflowName; this.initActionId = initActionId; } /** * 初始化工作流程 * * @param userName * @param inputs * @return * @throws Exception * @deprecated 使用doInitialize()替换 */ @SuppressWarnings("unchecked") @Deprecated public long doInitialize(String userName) { return doInitialize(); } @SuppressWarnings("unchecked") public long doInitialize(Map input) { long wf_id = -1; try { wf_id = workflow.initialize(workflowName, initActionId, input); } catch (InvalidRoleException e) { logger.info("当前用户不能初始化工作流"); } catch (Exception e) { throw new RuntimeException("初始化工作流出现问题:", e); } return wf_id; } /** * 初始化工作流程 */ @SuppressWarnings("unchecked") public long doInitialize() { return doInitialize(new HashMap()); } /** * 执行动作 * * @deprecated 使用doAction(workflowId,actionId,inputs)替换 */ @SuppressWarnings("unchecked") @Deprecated public void doAction(final String userName, final long workflowId, final int actionId, final Map inputs) { doAction(workflowId, actionId, inputs); } /** * 执行动作 * * @param userName * @param workflowId * @param actionId * @param inputs * @throws Exception */ @SuppressWarnings("unchecked") public void doAction(final long workflowId, final int actionId, final Map inputs) { try { workflow.setContext(); workflow.doAction(workflowId, actionId, inputs); } catch (Exception e) { throw new RuntimeException(e); } } /** * 流程是否结束 * @return true结束 */ public boolean hasEnd(String workflowId) { return queryCurrentStep(workflowId)==null?true:false; } /** * 执行动作 * * @param userName * @param workflowId * @param actionId * @param inputs * @throws Exception */ @SuppressWarnings("unchecked") public void doAction(final long workflowId, final int actionId) { doAction(workflowId, actionId, null); } public void doAction(final String workflowId, final int actionId) { Assert.hasLength(workflowId, "workflowId不能为空"); doAction(Long.parseLong(workflowId), actionId, null); } @SuppressWarnings("unchecked") public void doAction(final String workflowId, final int actionId, final String operationId) { Map inputs = new HashMap(); inputs.put("operationId", inputs); doAction(Long.parseLong(workflowId), actionId, inputs); } /** * 查询当前步骤的描述信息 * * @param workflowId * @param userName * @return * @deprecated 使用queryCurrentStepDescriptor(long workflowId)替换 */ @SuppressWarnings("unchecked") @Deprecated public StepDescriptor queryCurrentStepDescriptor(long workflowId, String userName) { return queryCurrentStepDescriptor(workflowId); } /** * 查询当前步骤的描述信息 * * @param workflowId * @param userName * @return */ @SuppressWarnings("unchecked") public StepDescriptor queryCurrentStepDescriptor(long workflowId) { List list = workflow.getCurrentSteps(workflowId); if (list == null || list.isEmpty()) { return null; } else { return queryStepDescriptor(((Step) list.get(0)).getStepId()); } } public StepDescriptor queryCurrentStepDescriptor(String workflowId) { return queryCurrentStepDescriptor(Long.parseLong(workflowId)); } /** * 查询当前步骤 * * @param workflowId * @deprecated 使用queryCurrentStep(long workflowId)替换 */ @SuppressWarnings("unchecked") @Deprecated public Step queryCurrentStep(long workflowId, String userName) { return queryCurrentStep(workflowId); } /** * 查询当前步骤 * * @param workflowId * @return */ @SuppressWarnings("unchecked") public Step queryCurrentStep(long workflowId) { List list = workflow.getCurrentSteps(workflowId); return list.isEmpty() ? null : ((Step) list.get(0)); } public Step queryCurrentStep(String workflowId) { return queryCurrentStep(Long.parseLong(workflowId)); } @SuppressWarnings("unchecked") public StepDescriptor queryStepDescriptor(int stepId) { return getWorkflowDescriptor().getStep(stepId); } /** * 指定Action是否是当前将要执行的action */ public boolean isCurrentAction(long workflowId, String userName, int actionId) { Map<Integer, String> actionMap = findAvailableActions(workflowId, userName); return actionMap.get(actionId) == null ? false : true; } /** * 得到用户指定流程的有效行动 * * @param workflowId * @param userName * @return actionID和名称的键值对 */ public Map<Integer, String> findAvailableActions(long workflowId, String userName) { Map<Integer, String> result = new HashMap<Integer, String>(); int[] availableActions = workflow.getAvailableActions(workflowId, null); WorkflowDescriptor wd = workflow .getWorkflowDescriptor(workflow.getWorkflowName(workflowId)); for (int i = 0; i < availableActions.length; i++) { int actionId = availableActions[i]; result.put(actionId, wd.getAction(actionId).getName()); } return result; } public Map<Integer, String> findAvailableActions(String workflowId, String userName) { Assert.hasLength(workflowId, "workflowId不能为空"); return findAvailableActions(Long.parseLong(workflowId), userName); } public String findActionName(int actionId) { ActionDescriptor actionDescriptor = getWorkflowDescriptor().getAction(actionId); return actionDescriptor == null ? null : actionDescriptor.getName(); } /** * 查询所有步骤 */ @SuppressWarnings("unchecked") public List<Step> findSteps(long workflowId) { Assert.isTrue(workflowId > 0, "workflowId必须大于零"); List<Step> result = new ArrayList<Step>(); List currentSteps = workflow.getCurrentSteps(workflowId); List historySteps = workflow.getHistorySteps(workflowId); result.addAll(currentSteps); result.addAll(historySteps); return result; } @SuppressWarnings("unchecked") public List<SimpleStep> findCurrentSteps(long workflowId) { Assert.isTrue(workflowId > 0, "workflowId必须大于零"); return workflow.getCurrentSteps(workflowId); } @SuppressWarnings("unchecked") public List<Step> findHistorySteps(long workflowId) { Assert.isTrue(workflowId > 0, "workflowId必须大于零"); return workflow.getHistorySteps(workflowId); } /** * 获得工作流描述 * */ public WorkflowDescriptor getWorkflowDescriptor() { return workflow.getWorkflowDescriptor(workflowName); } /** * 查询工作流描述 * */ public WorkflowDescriptor queryWorkflowDescriptor(long workflowId) { return workflow.getWorkflowDescriptor(workflow.getWorkflowName(workflowId)); } public void setWorkflow(IscsmWorkflow workflow) { this.workflow = workflow; } }
Workflow类,在这里你可以设置流程的执行者。
public class Workflow extends AbstractWorkflow { public void setContext() { String caller; try { caller = “你系统的用户”; } catch (Exception e) { caller = ""; } super.context = new BasicWorkflowContext(caller); } }
AbstractFunction类,所有Function的基类,继承他能得到很多工作流引擎自带的基础属性。如调用者,流程ID..等
import java.util.Map; import com.opensymphony.workflow.FunctionProvider; import com.opensymphony.workflow.basic.BasicWorkflowContext; import com.opensymphony.workflow.spi.WorkflowEntry; public abstract class AbstractFunction implements FunctionProvider { protected long workflowId; protected String caller; protected int actionId; private WorkflowService workflowService; @SuppressWarnings("unchecked") protected void set(Map transientVars,Map args) { WorkflowEntry workflowEntry = (WorkflowEntry) transientVars.get("entry"); workflowId = workflowEntry.getId(); BasicWorkflowContext context = (BasicWorkflowContext) transientVars.get("context"); caller = context.getCaller(); actionId = (Integer) transientVars.get("actionId"); } public void setWorkflowService(WorkflowService workflowService) { this.workflowService = workflowService; } }
使用自定义的condition来实现,用自己的权限系统控制流程
public class UserRightCondition implements Condition { private UserRoleDAO userRoleDAO; @SuppressWarnings("unchecked") public boolean passesCondition(Map transientVars, Map args, PropertySet ps) throws StoreException { String actionCode = (String) args.get("actionCode"); //在流程定义文件里配置能够执行当前流程的角色PK或者,权限PK。 //然后在这里判断当前caller是否有对应的权限和角色,如果有返回true return false; } }
一些内置的condition
- OSUserGroupCondition - 使用 OSUser来判断调用者是否在参数"group"中。
- StatusCondition - 判断当前步骤的状态是否与参数"status"相同。
- AllowOwnerOnlyCondition - 如果调用者是指定的步骤的所有者的话,那么只返回 true,如果没有指明步骤的话,就返回当前步骤。
- DenyOwnerCondition 与 AllowOwnerOnlyCondition 功能相反。
<condition type="class"> <arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg> <condition>
发表评论
-
Osworkflow开发需要注意的地方
2010-10-14 13:20 1696工作流名字的最大长度为20 <workflows> ... -
在Osworkflow中使用PropertySet存储业务数据
2010-01-28 17:10 2900PropertySet用于存储持久化数据,可以将这些数据存 ... -
深入osworkflow的function
2008-05-06 15:39 4731作者:kiral 原文地址:http://kiral.itey ... -
欢迎加入osworkflow组
2008-05-05 10:31 1467现在工作流还处于刚起步的阶段,对工作流感兴趣的人很难在一起交流 ... -
osworkflow的API封装
2008-05-05 10:20 1949/** * 初始化工作流 ... -
osworkflow如何与业务结合?
2008-05-05 09:45 2676osworkflow是一个轻量级的工作流开源框架,只提供工 ... -
工作流设计原则
2008-03-29 11:07 19851.一种业务对象使用一个流程, 如:某个流程就是用来处理文档, ...
相关推荐
总的来说,OsWorkflow工作流实例为我们提供了一个强大的工具,用于构建和管理业务流程。通过理解和实践这个实例,我们可以学习到如何在实际项目中应用工作流引擎,提升软件系统的灵活性和可维护性。无论是在企业级...
OSWorkflow 是一个开源的工作流解决方案,最初由OpenSymphony团队开发,现在由Atlassian公司维护。它允许开发者定义复杂的业务流程,并提供了一套API和Web界面来控制和监控这些流程。OSWorkflow 支持多种数据库存储...
本文档将对OSWorkFlow工作流系统的设计知识进行详细讲解。OSWorkFlow是一个开源的工作流引擎,适用于构建灵活、高效的企业级应用。它提供了一套完整的解决方案,帮助开发者实现业务流程自动化,提高工作效率。 ####...
OSWorkflow,全称OpenSymphony Workflow,是由OpenSymphony Group开发的一个轻量级工作流引擎。它的设计目标是提供一个可扩展且易于使用的平台,用于实现业务流程的建模和执行。OSWorkflow的核心特性包括: 1. **...
**工作流技术与OSWorkflow详解** 工作流(Workflow)是一种自动化业务流程的技术,它通过定义、执行和管理工作任务的流转,实现企业业务流程的规范化和自动化。在IT领域,工作流系统广泛应用于企业管理、项目协作、...
OSWorkflow的实现基于XML配置文件,这使得工作流定义易于理解和修改。通过XML,你可以定义每个步骤的属性,如参与者、后继步骤和相关条件。此外,OSWorkflow提供了API和事件监听器机制,允许开发者在流程执行过程中...
osworkflow在开发工作流管理系统时经常被推荐,尤其与WebWork2结合使用。尽管WebWork2已被Struts2取代,但有人提出osworkflow可能与Struts2实现完美整合,这为开发者提供了更多可能性。 最后,jflow是由CCflow发展...
综上所述,OSWorkflow开发指导与指南为开发者提供了一套完整的工作流管理方案,包括了工作流引擎的基本概念、组件结构、存储方式、配置和高级操作等多个方面,旨在帮助开发者快速理解和掌握OSWorkflow的开发与应用。
OSWorkflow 是一款基于 Java 的工作流引擎,能够与各种Java应用程序集成,如Java EE 应用服务器或Spring框架。 2. **OSWorkflow 特性**: - **流程定义**:OSWorkflow 支持XML格式的流程定义,允许开发者以直观的...
osWorkFlow是一款强大的开源工作流引擎,用于管理应用程序中的业务流程。它提供了灵活的工作流定义、状态跟踪以及任务分配等功能,极大地提升了企业级应用的流程自动化能力。osWorkFlow是基于Java开发的,因此可以...
OSWorkflow是由OpenSymphony组织开发的一款轻量级工作流引擎,适用于中小企业级别的应用系统。随着业务系统的复杂度增加,状态管理和流程控制的需求日益凸显,传统的硬编码方式无法满足高效、灵活的工作流管理需求。...
**osworkflow** 是一个开源的工作流引擎,它允许开发者在Java应用程序中实现复杂的业务流程管理。这个技术的主要目标是提供一种灵活、可扩展的方式,来定义、执行和控制业务流程。osworkflow 提供了一个强大的API,...
**OSWorkflow工作流程源码详解** ...通过上述步骤,你可以基于OSWorkflow构建出符合业务需求的工作流程系统,同时,通过深入研究源码,还能提升对工作流引擎原理的理解,为未来更复杂的工作流应用打下坚实基础。
《基于osworkflow与Eclipse的请假审批流程完整示例解析》 在IT行业中,工作流管理系统(Workflow Management System,简称WMS)是企业信息化建设的重要组成部分,它能够规范业务流程,提高工作效率。osworkflow是一...
这个压缩包文件包含了一个名为"osworkflow例子"的示例项目,它很可能是基于OSWorkflow框架的一个实例,OSWorkflow是Java领域中常用的工作流引擎之一。 首先,我们需要理解什么是工作流。工作流是指一系列相互关联、...
#### 与Spring联用的OSWorkflow工作流 ##### 创建工作流 在Spring环境下创建OSWorkflow实例时,通常会通过Spring的Bean工厂来进行初始化。首先,在Spring配置文件中定义一个`WorkflowStore` Bean,然后基于该Bean...
osWorkflow是一款开源的工作流引擎,它提供了灵活的工作流程定义和执行能力,使得开发者能够方便地在应用程序中集成工作流管理功能。本文将深入探讨如何在Spring和Hibernate的集成环境中运用osWorkflow2.8版本,实现...
此外,使用OSWorkflow提供的范例应用,开发人员可以在不涉及复杂持久化配置的情况下,快速学习和测试工作流的运作。 工作流管理系统通常需要持久化存储工作流的状态,这样即使在应用重启之后,工作流实例的状态信息...