欢迎与我交流(yun15291li@hotmail.com)
在这篇文章中,主要介绍osworkflow的核心概念以及重要的部分,让大家对osworkflow有个比较全面的认识。
在osworkflow中最最核心的东西就是工作流定义的xml文件。尽管它并不是一定要定义成xml文件。但是xml格式是一种标准的通用的格式。
这个xml文件为某一个给定的工作流进行描述steps、states,transitions,和functionality。下面阐述一下此xml的一般规则:
1、 一个工作流由多个steps组成
2、 对于每个step,可以包括多个actions。一个action可以被设置成自动运行或者需要通过人工交互才可以运行。
3、 每个action都要包括至少一个unconditional result和0或多个conditional results。
4、 如果设定了多个concitioanl results,所有当中的第一个将被执行,如果没有设定conditional results或者没有conditions满足,那么执行unconditional result
5、 一个result过后可能依旧停留在当前的step中,一个新的step,一个split,一个join。在所有的情形中,工作流的state跟着变化(例子工作流中的states分别为:underway,queued,和finished)
6、 如果一个result引起一个split,这个result会指定split的属性,以指向一个split元素。
7、 一个split可以有一个或者多个unconditional results,但是没有conditional results。unconditional results。unconditional results需要指定steps。
8、 一个propertyset是一个持久层数据的map,在全局应用中都是可用的。
9、 还有一种叫做transientvars的map,它只存活于一个工作流调用过程中的一定的生命周期,它将会对所有functions和conditions,包括所有的registers,user input,以及工作流上下文状态等起作用。
工作流概念:
下面开始理解osworkflow的核心概念:
对于step,status,actions部分就不多说明了,其实我觉得理解概念的最快方法应该是参照实例,即使我们不能用高高大大的词汇描绘出来,能自己理解是什么意思就可以了。
unconditional result 和 conditional results
这里做以简单介绍,对于每个action,要求至少存在一个unconditional result,一个result也就是通过一系列指示来告诉osworkflow下一步的任务是干什么。这种调用使得产生变迁进而从一个state到另外一个state。这种概念是在uml的状态机里有讲,希望了解状态机相关概念的可以到uml相关书籍中查看。
conditional result是unconditional result的一种扩展。不同的地方在于他需要一些子元素:condition。用and 和 or来标志各个condition之间的关系。
conditional 和unconditional 的最终result可以产生三种效应或者说是结果:
1、 一个新的step/status
2、 一个split,出现一或多个step/status
3、 一个join,一个新的step/status
普遍的,一个split或者join不能result出另外一个split或join。
一个step/status result可以按下面方式简单的设定:
<unconditional-result old-status="finished" step="2"
status="underway" owner="${someowner}"/>
从一个state split 到多个 states可以按以下方式达到:
<unconditional-result split="1"/>...<splits> <split id="1"> <unconditional-result old-status="finished" step="2" status="underway" owner="${someowner}"/> <unconditional-result old-status="finished" step="2" status="underway" owner="${someotherowner}"/> </split></splits>
joins是比较复杂的用例。一个典型的join看起来大致如下:
<!-- for step id 6 -><unconditional-result join="1"/>...<!- for step id 8 -><unconditional-result join="1"/>...<joins> <join id="1"> <join id="1"> <conditions type="and"> <condition type="beanshell"> <arg name="script"> "finished".equals(jn.getstep(6).getstatus() && "finished".equals(jn.getstep(8).getstatus()) </arg> </condition> </conditions> </join> <unconditional-result old-status="finished" status="underway" owner="test" step="2"/> </join></joins>上面这段代码中最需要关心的就应该是jn。当join实际发生的时候,这个特殊的变量jn可以被用来建立表达式。本质上,可以很容易理解出这个段xml的意思就是:当step6和8都finish时候在此处进行join。
functions部分:
osworkflow用function来定义商业逻辑和一些需要定义执行的服务。用functions标签来表示。
两种functions(pre和post)
pre 是在工作流进行某个变迁之前需要被执行的。一个比较好的例子:为了在result中state变更产生,而先建立caller。
post是在之后执行的。如当某一个state改变后,发送一email到某处。
functions可以在两个分别的地方被指定:steps和actions。
trigger functions
validators
registers
一个function:用来返回一个用以被其他普通对象能够容易访问得到的对象。尤其是指workflow 的实体类。返回的对象类型不闲典型的例子如:document,metadata,issue,task等。非常便利。
<registers> <register name="doc" class="com.acme.documentregister"/></registers>...<results> <result condition="doc.priority == 1" step="1" status="underway" owner="${somemanager}"/> <unconditional-result step="1" status="queued"/></results>
conditions
变量
授权与限权
自动执行的action
设置auto=true
common and global actions:
common和globalactions的主要作用在于在工作流定义文件中能够避免代码重复。
基本思想就是简单。这两种actions是在最开始就进行说明的,在initial-actions元素后面。
这两处还不能完全理解好!
common actions:在最开始定义好,可以在其他地方如此引用
<common-action id="100" />
例如一个“send mail”的action
global actions:不同之处在于显式的被某一个step引用。它通常对所有的steps都是可用的。一个例子:“终止工作流”,在任何一步,都有可能终止工作流。
需要注意的是:这两种actions要具备唯一的id,而不能和其他action的id重复。
接下来主要讲解关于function的四种情况:
osworkflow中的function就是可以在变迁之前或者后进行执行的内容。
1、 基于java的functions
从classloader中加载java 类,通过jndi找会java类,远程ejbs,本地ejb。
这一类型的function必须实现接口:com.opensymphony.workflow.functionprovider,在这个接口中有一个方法execute。这个方法(execute)需要三个参数
可以自己去查api即可找到这三个参数,两个map
-
关于我们
公司介绍 最新动态 联系我们 -
产品与服务
域名注册 jsp空间 php空间 -
常见问题
空间操作手册 网站备案相关 退款相关问题 -
技术支持
技术 QQ :178966803 联系电话:13616026886 联系邮箱:fjjsp@vip.163.com
扫描关注微信公众号
闽公网安备 35060202000074号