`

工作流(OSWorkFLOW)的例子改造

阅读更多

/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://wallimn.iteye.com
   http://blog.csdn.net/wallimn
时间:2006-11-15
/***********本人原创,欢迎转载,转载请保留本人信息*************/

相信现在关注工作流的人越来越多了,我也是其中之一,上网狂搜了一下,发现很多人说开源的工作流OSWorkFlow还不错,我也Download下载研究研究。

文档很少,只有上网再搜,发现很多资料都是你转载我,我转载你,原创的不多。反来复去地看了看网上的资料,再看看OSWorkFlow的自带文档,调试带的例子。

发现那个例子说明性不是很强,把人弄得很晕,经过一翻分析,我把例子修改了一下,添加了些注释,一些JSP页面也修改了一下并进行了汉化,设定了几个用户组,分别具有不同的权限,使工作流流转起来真正象个工作流。希望能对刚开始学习工作流的同志有所帮助。下面我贴出工作流定义的XML文件。完整的例子请到我的网络硬盘下载。下载地址:http://wallimn.gbaopan.com

工作流文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd ">
<!--OSWorkFlow工作流定义文件修改 by wallimn(wallimn@sohu.com )-->
<!--欢迎转载,转载请保留这些信息。-->
<workflow>
 <initial-actions>
  <action id="100" name="启动工作流">
   <restrict-to>
    <conditions type="AND">
     <condition type="beanshell">
      <arg name="script">true</arg>
     </condition>
     <condition type="class"><!--仅作家组可以启动流程-->
      <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
      <arg name="group">writer</arg>
     </condition>
    </conditions>
   </restrict-to>
   <pre-functions>
    <function type="class">
     <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
   </pre-functions>
   <results><!--转到step 1,流程所有者设为流程启动者-->
    <unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
   </results>
  </action>
 </initial-actions>
 <steps>
  <step id="1" name="撰写初稿">
   <external-permissions>
    <permission name="permA">
     <restrict-to>
      <conditions type="AND">
       <condition type="class"><!--流程处于Underway状态(流程已经启动)-->
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class"><!--流程启动者(也即流程所有者)-->
        <arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
       </condition>
      </conditions>
     </restrict-to>
    </permission>
   </external-permissions>
   <actions>
    <action id="1" name="完成初稿">
     <restrict-to>
      <conditions type="AND">
       <condition type="beanshell">
        <arg name="script">true</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="beanshell">
       <arg name="script">
                                String caller = context.getCaller();
                                propertySet.setString("caller", caller);
                                boolean test = true;
                                String yuck = null;
                                String blah = "987654321";
                                System.out.println("Step:1预处理函数");
                                </arg>
      </function>
     </pre-functions>
     <results>
      <result old-status="Finished" split="1">
       <conditions type="AND"><!--如果是新手(假定新手的用户名为newplayer),流转到分枝1-->
        <condition type="beanshell">
         <arg name="script">
         propertySet.getString("caller").equals("newplayer")
         </arg>
        </condition>
       </conditions>
       <post-functions>
        <function type="beanshell">
         <arg name="script">
                                                                          System.out.println("Step:1的Action后处理函数");
                                         </arg>
        </function>
       </post-functions>
      </result>
      <unconditional-result old-status="Finished" split="2"/><!--其余情况跳转到分枝2-->
     </results>
     <post-functions>
      <function type="beanshell">
       <arg name="script">
                                                          System.out.println("Step:2的后处理函数");
                                </arg>
      </function>
                        <!--
                        <function type="class">
                            <arg name="class.name">com.opensymphony.workflow.util.ScheduleJob</arg>
                            <arg name="triggerId">1</arg>
                            <arg name="jobName">testJob</arg>
                            <arg name="triggerName">testTrigger</arg>
                            <arg name="groupName">test</arg>

                            <arg name="repeat">10</arg>
                            <arg name="repeatDelay">2000</arg>
                            <arg name="cronExpression">0,5,10,15,20,25,30,35,40,45,50,55 * * * * ?</arg>

                            <arg name="username">test</arg>
                            <arg name="password">test</arg>

                            <arg name="local">true</arg>
                            <arg name="schedulerStart">true</arg>
                        </function>
                        -->
     </post-functions>
    </action>
   </actions>
  </step>
  <step id="2" name="校对稿件"><!--稿件都弄好了,校对一下吧-->
   <external-permissions>
    <permission name="permB">
     <restrict-to>
      <conditions type="AND">
       <condition type="class"><!--状态为Underway-->
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class"><!--仅允许editor组的成员-->
                                                          <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
                                                          <arg name="group">editor</arg>
       </condition>
      </conditions>
     </restrict-to>

    </permission>
   </external-permissions>
   <actions>
    <action id="2" name="准备校对积压的稿件"><!--从队列中提取,准备校对-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class"><!--队列中-->
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Queued</arg>
       </condition>
       <condition type="class"><!--仅允许editor组的成员-->
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">editor</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="class"><!--设置caller变量为执行当前action的用户-->
       <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
      </function>
     </pre-functions>
     <results><!--状态变为Underway-->
      <unconditional-result old-status="Finished" status="Underway" step="2" owner="${caller}"/>
     </results>
    </action>
    <action id="3" name="校对完成"><!--检验完成,流转到下一步-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class"><!--处理当前的任务(也就是说不在队列中的)-->
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class"><!--仅允许editor组的成员-->
                                                          <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
                                                          <arg name="group">editor</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="class"><!--设置mostRecentOwner的值为第一阶段时的Owner-->
       <arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
       <arg name="stepId">1</arg>
      </function>
     </pre-functions>
     <results>
      <unconditional-result old-status="Finished" status="Underway" step="3" owner="${mostRecentOwner}"/>
     </results>
    </action>
    <action id="4" name="处理不过来了,等一等"><!--还有几个没有下理,排一下队,等我空闲了再说吧-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class"><!--仅允许editor组的成员-->
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">editor</arg>
       </condition>
      </conditions>
     </restrict-to>
     <results><!--转为排队等候状态-->
      <unconditional-result old-status="Finished" status="Queued" step="2"/>
     </results>
    </action>
   </actions>
  </step>
  <step id="3" name="检查校对情况">
   <external-permissions>
    <permission name="permA">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class"><!--publisher组的成员来检查-->
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
    </permission>
   </external-permissions>
   <actions>
    <action id="5" name="重新校对"><!--错误比较多,重新校对-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="class">
       <arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
       <arg name="stepId">2</arg>
      </function>
     </pre-functions>
     <results>
      <unconditional-result old-status="Finished" status="Underway" step="2" owner="${mostRecentOwner}"/>
     </results>
    </action>
    <action id="6" name="需要二审"><!--需要二审-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
     <results><!--转入二审阶段-->
      <unconditional-result old-status="Finished" status="Queued" step="4"/>
     </results>
    </action>
    <action id="7" name="可以出版了"><!--可以了,准备出版-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="class">
       <arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
       <arg name="stepId">2</arg>
      </function>
     </pre-functions>
     <results>
      <unconditional-result old-status="Finished" status="Underway" step="5" owner="${mostRecentOwner}"/>
     </results>
    </action>
   </actions>
  </step>
  <step id="4" name="二审阶段"><!--二审阶段-->
   <external-permissions>
    <permission name="permC">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
    </permission>
   </external-permissions>
   <actions>
    <action id="8" name="二审通过"><!--二审通过,转到step2,等候出版-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="class">
       <arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
       <arg name="stepId">3</arg>
      </function>
     </pre-functions>
     <results>
      <unconditional-result old-status="Finished" status="Underway" step="3" owner="${mostRecentOwner}"/>
     </results>
    </action>
    <action id="9" name="从排队中取出准备二审"><!--仍停留在此阶段-->
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Queued</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="class">
       <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
      </function>
     </pre-functions>
     <results>
      <unconditional-result old-status="Finished" status="Underway" step="4" owner="${caller}"/>
     </results>
    </action>
    <action id="10" name="好多要二审的,排队等等">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
     <results><!--变为排队状态-->
      <unconditional-result old-status="Finished" status="Queued" step="4"/>
     </results>
    </action>
   </actions>
  </step>
  <step id="5" name="出版稿件">
   <actions>
    <action id="11" name="出版">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">publisher</arg>
       </condition>
      </conditions>
     </restrict-to>
     <pre-functions>
      <function type="class">
       <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
      </function>
     </pre-functions>
     <results>
      <unconditional-result old-status="Finished" status="Finished" step="5" owner="${caller}"/>
     </results>
    </action>
   </actions>
  </step>
  <step id="6" name="设计封面">
   <actions>
    <action name="封面设计完成" id="12">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
        <arg name="stepId">6</arg>
       </condition>
       <condition type="class"><!--仅允许美工组-->
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">designer</arg>
       </condition>
      </conditions>
     </restrict-to>
     <results>
      <unconditional-result old-status="Finished" join="1"/>
     </results>
    </action>
   </actions>
  </step>
  <step id="7" name="设计插图">
   <actions>
    <action name="插图设计完毕" id="13">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
        <arg name="stepId">7</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">designer</arg>
       </condition>
      </conditions>
     </restrict-to>
     <results>
      <unconditional-result old-status="Finished" owner="test" status="Underway" step="8"/>
     </results>
    </action>
   </actions>
  </step>
  <step id="8" name="排版">
   <actions>
    <action name="排版完毕" id="14">
     <restrict-to>
      <conditions type="AND">
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
        <arg name="status">Underway</arg>
        <arg name="stepId">8</arg>
       </condition>
       <condition type="class">
        <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
        <arg name="group">designer</arg>
       </condition>
      </conditions>
     </restrict-to>
     <results>
      <unconditional-result old-status="Finished" join="1"/>
     </results>
    </action>
   </actions>
  </step>
 </steps>
 <splits>
  <split id="1">
   <unconditional-result old-status="Finished" status="Underway" owner="test" step="6"/>
   <unconditional-result old-status="Finished" status="Underway" owner="test" step="7"/>
  </split>
  <split id="2">
   <unconditional-result old-status="Finished" status="Queued" step="2"/>
  </split>
 </splits>
 <joins>
  <join id="1">
   <conditions type="AND">
    <condition type="beanshell">
     <arg name="script"><![CDATA[
     "Finished".equals(jn.getStep(6).getStatus()) && "Finished".equals(jn.getStep(8).getStatus())
     ]]></arg>
    </condition>
   </conditions>
   <unconditional-result old-status="Finished" status="Underway" owner="test" step="2"/>
  </join>
 </joins>
</workflow>

 

  完整例子请到我的网络硬盘下载:http://wallimn.ys168.com

1
0
分享到:
评论

相关推荐

    工作流 osworkflow 例子和原理

    OSWorkflow(OpenSymphony Workflow)是一个开源的工作流引擎,它提供了一种灵活的方式来设计、实施和管理业务流程。本篇文章将深入探讨OSWorkflow的工作原理及其应用实例。 OSWorkflow的核心概念包括工作流定义、...

    状态机工作流OSWorkflow

    OSWorkflow 是一个开源的工作流引擎,专门用于实现这种状态机模型。 OSWorkflow 提供了一个强大的框架,允许开发者在应用程序中轻松地管理和控制工作流程。它的核心功能包括: 1. **状态管理**:OSWorkflow 支持...

    OsWorkflow工作流实例

    OsWorkflow是一款开源的工作流引擎,它为应用程序提供了一种灵活且可扩展的方式来管理业务流程。在本实例中,我们将深入探讨OsWorkflow的核心概念、主要功能以及如何创建和测试一个工作流实例。 工作流引擎是软件...

    workflow_osworkflow_工作流_

    **工作流技术与OSWorkflow详解** 工作流(Workflow)是一种自动化业务流程的技术,它通过定义、执行和管理工作任务的流转来提高企业的效率和灵活性。在信息化时代,工作流管理系统(Workflow Management System, ...

    osworkflow详细资料 pdf 工作流

    **工作流技术与OSWorkflow详解** 工作流(Workflow)是一种自动化业务流程的技术,它通过定义、执行和管理工作任务的流转,实现企业业务流程的规范化和自动化。在IT领域,工作流系统广泛应用于企业管理、项目协作、...

    OSWorkFlow 工作流系统设计知识的详细讲解

    ### OSWorkFlow 工作流系统设计知识的详细讲解 #### 概述 本文档将对OSWorkFlow工作流系统的设计知识进行详细讲解。OSWorkFlow是一个开源的工作流引擎,适用于构建灵活、高效的企业级应用。它提供了一套完整的解决...

    Java四大主流开源工作流引擎分析Shark,osworkflow,jbpm,jflow

    本文将深入分析四个主流的开源工作流引擎:Shark、osworkflow、jbpm和jflow。 首先,Shark是Enhydra项目的一部分,Enhydra是一个涵盖广泛的技术栈,包括J2EE应用服务器、对象/关系映射工具以及工作流引擎等。Shark...

    工作流引擎(osworkflow) 2.80

    工作流引擎(osworkflow) 2.80 是一个开源的工作流管理系统,专为处理复杂的业务流程自动化而设计。OSWorkflow 提供了一种灵活的方式,使开发者能够定义、执行和管理组织内部的工作流程。这个版本包括了示例项目和...

    工作流引擎 Osworkflow 及其持久化机制的研究

    ### 工作流引擎 Osworkflow 及其持久化机制的研究 #### 1. 引言 随着企业信息化的发展,工作流技术作为一种重要的自动化工具,在提高工作效率、优化业务流程方面发挥着重要作用。工作流引擎作为工作流系统的核心...

    Osworkflow 入门级例子

    这个入门级的例子将带你了解 Osworkflow2.8 的基本概念和如何在项目中简单地实现工作流。 Osworkflow 提供了一个强大的框架,允许开发者定义、执行和控制业务流程。它的核心功能包括流程定义、流程实例管理、任务...

    OSWorkflow 工作流 开发指南、中文手册

    OSWorkflow 是一个强大的工作流引擎,它为Java应用程序提供了灵活的工作流管理能力。这个开发指南和中文手册将帮助开发者深入理解和有效地使用OSWorkflow。在本文中,我们将详细探讨OSWorkflow的核心概念、功能特性...

    基于开源工作流引擎OSWorkflow的电子政务系统的研究与实现

    电子政务,即政府机构运用现代计算机和网络技术,将其管理和服务职能转移到网络,同时实现政府组织结构和工作流程的重组优化,超越时间、空间和部门分隔的制约,为全社会提供高效优质、规范透明和全方位的管理与服务...

    osworkflow+mysql例子(该例子有问题,请勿下载)

    OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。与 MySQL 的结合,可以将工作流的状态和历史数据存储在数据库中,便于管理和查询。然而,根据提供的标题和描述,这个特定的例子...

    OSWorkflow演示例子

    OSWorkflow(OpenSymphony Workflow)是一款开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程。这个"OSWorkflow演示例子"提供了如何使用OSWorkflow的实际示例,帮助开发者更好地理解和应用这一工具。...

    用OSWorkFlow和JBPM开发工作流异同点解析

    【工作流引擎选择:OSWorkflow vs JBPM】 工作流管理系统(Workflow Management System,WfMS)在企业级应用中扮演着重要角色,用于自动化业务流程。OSWorkflow 和 JBPM 是两个广泛使用的开源工作流引擎,它们各有...

    OSworkFlow工作流请假流程实例

    OSworkflow(OpenSymphony Workflow)是一个开源的工作流管理系统,它提供了强大的流程定义和执行的能力,广泛应用于企业级应用中,如请假流程等业务场景。在本实例中,我们将深入探讨如何利用OSworkflow来实现一个...

    osworkflow在tomcat6下的持久化例子,用mysql

    总结来说,这个例子提供了一个完整的解决方案,展示如何在Tomcat 6环境中使用OSWorkflow,并将工作流状态持久化到MySQL数据库。开发者可以以此为基础,根据实际需求调整和扩展工作流定义,从而实现更复杂的企业级...

    osworkflow例子汉化

    **osworkflow 概述** ...总结,osworkflow是一个强大的工作流解决方案,通过"OsTest"汉化示例,开发者尤其是初学者能够更加轻松地学习和使用osworkflow,理解工作流引擎如何帮助实现业务流程自动化。

Global site tag (gtag.js) - Google Analytics