OSWorkFlow深入浅出(5)---Step详解
来源:互联网 发布:薛绍对太平公主 知乎 编辑:程序博客网 时间:2024/06/05 19:39
昨天说了那么多,想必有些人对OSWorkFlow 有一个大体上的认识,但是还是不够详细,那么我们就对照着第一篇中的脑图进行逐个突破,先来说说最为重要的Step元素吧
一个workflow的实例是由一个或者多个step组成,在某一个特定的时刻,workflow可执行的step也存在一个或者多个,甚至会有并发执行的情况(split我们在后面介绍),先来看看step的结构,从他的dtd来看最合适不过了!
<!ELEMENT step (meta*, pre-functions?, external-permissions?, actions?, post-functions?)><!ATTLIST stepid CDATA #REQUIREDname CDATA #REQUIRED>
<!ELEMENT steps (step+)>从DTD的描述中可以看到steps必须有一个以上的step标签,而step中的元素详解如下:
1、meta:0~n个,主要起到解释的作用,没有很多实际的意义,比如你要描述这一段step代表什么,就可以填充meta标签;
2、pre-functions:0~1个,主要是在进入step之后,执行Action之前调用的函数,我们也会有专门的章节介绍这个标签,并且自己实现一个pre-functions。
3、external-permissions:0~1个,主要是进行外部权限的判断,比如我们在oswf中加入了角色之后,这个标签就会起到他的作用,在后文中介绍。
4、Actions:0~1个,进入step之后触发的动作,这也是我们在后面需要重点讲解的标签;
5、post-function:0~1个,主要是当step执行完之后需要触发的函数,在后文中同样需要讲解。
了解了上述标签的意思之后,我们来看看具体的例子,在一些具体的单元测试中,也许有些标签在这一章中并未涉及,但是不要太过担心,在后文中都会一一解释。
pre-function测试
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN" "http://www.opensymphony.com/osworkflow/workflow_2_7.dtd"><workflow><initial-actions><action id="1" name="Start Workflow"><results><unconditional-result old-status="Finished"status="Underway" step="1" owner="step" /></results></action></initial-actions><steps><step id="1" name="First Step"><pre-functions><function type="beanshell" name="bsh.function"><arg name="script">propertySet.setString("prekey", "prevalue")</arg></function></pre-functions><actions><action id="2" name="action2" finish="true"><results><unconditional-result old-status="Finished" status="FinalFinished" step="-1"/></results></action></actions></step></steps></workflow>看到了吗,我们在step1中配置了一个pre-functions,其中有一个function,类型为beanshell,参数为script,并且执行了propertySet.setString方法设置了preKey的值。上面的pre-function中包含了丰富的内容,首先在osworkflow中嵌入了beanshell,java脚本语言的执行引擎,因此我们可以动态执行beanshell的脚本,参数中propertySet为osworkflow的一个内置对象,我们在讲解源码的时候会说到这个东西,他是引用了另外一个开源项目PropertySet。
解释完我们的配置之后,我们来说说我们要达到什么目的,我们在action执行之前执行了pre-function,那么是否在java代码中我们可以获取到prekey的值呢?并且必须在执行action之前,有这样的一个预期,我们就动手编写单元测试。
单元测试代码
package com.wangwenjun.osworkflow;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import com.opensymphony.workflow.InvalidActionException;import com.opensymphony.workflow.InvalidEntryStateException;import com.opensymphony.workflow.InvalidInputException;import com.opensymphony.workflow.InvalidRoleException;import com.opensymphony.workflow.Workflow;import com.opensymphony.workflow.WorkflowException;import com.opensymphony.workflow.basic.BasicWorkflow;/** * This class is for test step element on flow configuration. * @author Alex(QQ:532500648) */public class StepTest {private Workflow wf = null;@Beforepublic void init() {wf = new BasicWorkflow("step");}@Testpublic void testPreFunctionOnStep(){long id;try {id = wf.initialize("step", 1, null);/*Determine the prekey value whether is equal*/Assert.assertEquals("prevalue",wf.getPropertySet(id).getString("prekey"));wf.doAction(id, 2, null);/*after execute action*/Assert.assertEquals("prevalue",wf.getPropertySet(id).getString("prekey"));} catch (InvalidActionException e) {e.printStackTrace();} catch (InvalidRoleException e) {e.printStackTrace();} catch (InvalidInputException e) {e.printStackTrace();} catch (InvalidEntryStateException e) {e.printStackTrace();} catch (WorkflowException e) {e.printStackTrace();}}}
单元测试顺利通过,符合我们的预期,但是我们又执行了一下action,并且在action执行之后试图再次进行测试,我们发现结果也符合预期,其实这就是propertySet框架的作用,他就像hashMap一样,保留了很多key-value对。
post-function测试
稍微修改一下流程配置文件,在Actions标签之后增加如下的配置信息
<post-functions><function type="beanshell" name="bsh.function"><arg name="script">propertySet.setString("prekey", "changed")</arg></function></post-functions>针对上面的配置,我们期望得到的结果是,在执行action之前prekey的值为prevalue,当执行完action即将推出step时,prekey的值应该变为changed,看看junit测试代码吧
@Testpublic void testPostFunctionOnStep(){long id;try {id = wf.initialize("step", 1, null);/*Determine the prekey value whether is equal*/Assert.assertEquals("prevalue",wf.getPropertySet(id).getString("prekey"));wf.doAction(id, 2, null);/*after execute action value not equals*/Assert.assertFalse("prevalue".equals(wf.getPropertySet(id).getString("prekey")));/*prevalue changed is our excepted.*/Assert.assertEquals("changed",wf.getPropertySet(id).getString("prekey"));} catch (InvalidActionException e) {e.printStackTrace();} catch (InvalidRoleException e) {e.printStackTrace();} catch (InvalidInputException e) {e.printStackTrace();} catch (InvalidEntryStateException e) {e.printStackTrace();} catch (WorkflowException e) {e.printStackTrace();}}单元测试畅通无阻的执行,一路绿灯,我们的判断没有丝毫的问题,好了,我们在下一节中将会讲解如下几个标签
1、join
2、split
- OSWorkFlow深入浅出(5)---Step详解
- OSWorkFlow深入浅出(6)---Step2详解
- OSWorkFlow深入浅出(7)---Step3详解
- OsWorkFlow深入浅出(清单)
- OSWorkFlow深入浅出(1)---介绍
- OSWorkFlow深入浅出(2)---配置
- OSWorkFlow深入浅出(4)---犹抱琵琶半遮面
- OSWorkFlow流程配置文件详解
- OSWorkFlow深入浅出(3)---让工作流起来
- Spring Batch(5): Step详解
- Spring Batch(5): Step详解
- Spring Batch(5): Step详解
- osworkflow详解及异常大全
- 安装Colinux&Informix11.5&DBSonar过程详解-step by step
- 安装Colinux&Informix11.5&DBSonar过程详解-step by step
- OSWorkFlow
- osworkflow
- OSWorkflow
- mysql中的函数
- The connection to adb is down, and a severe error has occured
- 实例化异常
- 问题:SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 MYPC/Administrator' 的信息,错误代码 0x534
- STM32的GPIO输入输出模式配置
- OSWorkFlow深入浅出(5)---Step详解
- qt中删除tableview中的选中行
- typedef用法
- Ural 1126. Magnetic Storms 单调队列
- 博客转移
- 系统总体架构-1
- Android JNI(NDK)开发总结
- matlab变量
- 《C Programming Language: A Modern Approach》