Osworkflow初探

一、Osworkflow两个重要的概念:

steps:步骤

actions:动作

initial-actions:初始化步骤

1、steps步骤:描述一个工作流所处的位置

2、actions:指定了可能发生在步骤内的转变,一个step包含多个action,一个action由两部分组成:执行此条件的condition及执行此动作后的result

3、initial-actions:初始化步骤,是一种特殊的步骤,用来启动工作流

二、属性:

old_status:用来指明当前步骤完成以后的状态是什么

status:指明需要检查的状态条件,目前Osworkflow中有underway进行中、queued等候处理中、Finished完成三种状态

conditon:类似逻辑判断,可包含"and"、"or"逻辑

result:执行action后的结果,分两种,Conditional-result有条件结果、Unconditional-result无条件结果

split、join:流程的切分/融合,split可以提供多个result,join根据多个step的状态提供一个result

三、函数:

Caller:Osworkflow提供的内置函数,该函数获得当前调用工作流的用户,并放入一个名为caller的字符型变量中

四:运行:

1、首先需要定义以下几个文件:

osworkflow.xml:

<?xml version="1.0" encoding="UTF-8"?>
<osworkflow>
  <factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
    <property key="resource" value="workflows.xml"/>
  </factory>
</osworkflow>

<osworkflow>有一个属性:<persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>表示使用内存存储流程数据

XMLWorkflowFactory:管理流程定义文件,包括读取定义文件及修改定义文件的功能,resource指定读取定义文件的位置

workflows.xml:

<?xml version="1.0" encoding="UTF-8"?>
<workflows>
<workflow name="vc_audit" type="resource" location="osworkflow/vc_audit.xml"></workflow>
</workflows>

2、执行步骤如下(参考)

为了简单起见,我们采用BasicWorkflow来创建一个单一的用户模式,避免编写其他获取用户方法的麻烦。
这样我们来创建一个‘testuser‘调用的workflow:
Workflow workflow = new BasicWorkflow("testuser");
下一步是提供配置文件,在大多数情况下,只是简单的传递一个DefaultConfiguration实例:
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
现在我们已经创建并且配置好了一个workflow,接下来就是开始调用它了。
启动和进行一个工作流程
首先我们需要调用initialize 方法来启动一个工作流程,这个方法有3个参数,workflow name (定义在workflows.xml里,通过workflow factory处理), action ID (我们要调用的初始化动作的ID),和初始化变量。 因为在例子里面不需初始化变量,所以我们只是传递一个null,
long workflowId = workflow.initialize("mytest", 1, null);
我们现在已经有了一个工作流实例,返回的workflowId可以在后续的操作中来代表这个实例。这个参数会在Workflow interface的绝大部分方法中用到。
检验工作流
现在让我们来检验启动的工作流实例是否按照我们所预期的那样运行。根据流程定义,我们期望的当前步骤是第一步,而且应该可以执行第一个动作(开始编写草稿)。
Collection currentSteps = workflow.getCurrentSteps
(workflowId);
//校验只有一个当前步骤
assertEquals("Unexpected number of current steps",
1, currentSteps.size());
//校验这个步骤是1
Step currentStep = (Step)currentSteps.iterator().next();
assertEquals("Unexpected current step", 1,
currentStep.getStepId());
int[] availableActions =
workflow.getAvailableActions(workflowId);
//校验只有一个可执行的动作
assertEquals("Unexpected number of available actions", 1,
availableActions.length);
//校验这个步骤是1
assertEquals("Unexpected available action", 1, availableActions[0]);
执行动作
现在已经校验完了工作流实例正如我们所期望的到了第一个步骤,让我们来开始执行第一个动作:
workflow.doAction(workflowId, 1, null);
这是简单的调用第一个动作,工作流引擎根据指定的条件,改变状态到‘Underway’,并且保持在当前步骤。
现在我们可以类似地调用第2个动作,它所需要的条件已经都满足了。
在调用完第2个动作以后,根据流程定义就没有可用的动作了,getAvailableActions将会返回一个空数组。

五、property set

1、PropertySet:有时候可能需要在工作流的任意位置持久化一些少量数据,PropertySet作用就是如此,是一个可持久化的类型安全map,可以添加任意类型数据到propertyset(一个工作流实例对应一个propertyset),并在以后的流程中读取这些数据,用法如下:

<function type="beanshell">
<arg name="script">propertySet.setString("foo", "bar")</arg>
</function>
这样我们就添加了一个持久化的属性“foo”,它的值是“bar”。这样在以后的流程中,我们就可以获得这个值了。

2、transient map :临时变量

只在当前工作流调用的上下文中有效,workflow.doAction(workflowId, 1, null);如果传入不是null的话就会存到临时变量中

3、register寄存器:

一个工作流的全局变量,和propertyset类似,可以在工作流实例的任意地方获取,与propertyset不同的地方是,它是一个非持久化的一个数据,每次调用都需要重新计算数据,寄存器的值存放在临时变量transient map中,须实现Register接口,并且定在在初始化动作之前

六、

OSWorkFlow表结构分析

1、OS_WFENTRY 工作流主表,存放工作流名称和状态

字段名 数据类型 说明

ID NUMBER 自动编号

NAME VARCHAR2(20) 工作流名称

STATE NUMBER 工作流状态

2、OS_CURRENTSTEP当前步骤表,存放当前正在进行步骤的数据

字段名 数据类型 说明

ID NUMBER 自动编号

ENTRY_ID NUMBER 工作流编号

STEP_ID NUMBER 步骤编号

ACTION_ID NUMBER 动作编号

OWNER VARCHAR2(20) 步骤的所有者

START_DATE DATE 开始时间

FINISH_DATE DATE 结束时间

DUE_DATE DATE 授权时间

STATUS VARCHAR2(20) 状态

CALLER VARCHAR2(20) 操作人员的帐号名称

3、 OS_CURRENTSTEP_PREV 前步骤表,存放当前步骤和上一个步骤的关联数据

字段名 数据类型 说明

ID NUMBER 当前步骤编号

PREVIOUS NUMBER 前步骤编号

 

时间: 2024-08-08 05:32:02

Osworkflow初探的相关文章

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

[转载]HDFS初探之旅

转载自 http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html , 感谢虾皮工作室这一系列精彩的文章. Hadoop集群(第8期)_HDFS初探之旅 1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上.它所具有的高容错.高可靠性.高可扩展性.高

MongoDB初探系列之二:认识MongoDB提供的一些常用工具

在初探一中,我们已经可以顺利的将MongoDB在我们自己的机器上跑起来了.但是在其bin目录下面还有一些我们不熟知的工具.接下来,将介绍一下各个小工具的用途以及初探一中MongoDB在data文件夹下创建的文件的用途. 1.bin目录下面的各种小工具简介及使用方式 bsondump.exe 用于将导出的BSON文件格式转换为JSON格式mongo.exe mongoDB的客户端 mongod.exe 用于启动mongoDB的Server mongodump.exe 用于从mongodb数据库中导

Asynchronous Pluggable Protocols 初探

Asynchronous Pluggable Protocols,异步可插入协议,允许开发者创建可插协议处理器,MIME过滤器,以及命名空间处理器工作在微软IE4.0浏览器以及更高版本或者URL moniker中.这涉及到Urlmon.dll动态链接库所公开(输出)的可插协议诸多功能,本文不进行深入的原理讲解,只对它其中之一的应用进行解析,那就是如何将一个应用程序注册为URL协议. 应用场景: tencent协议: 当我们打开"tencent://message/?uin=要链接的QQ号 &qu

重新认识HTML,CSS,Javascript 之node-webkit 初探

今天我们来系统的.全面的 了解一下前端的一些技术,将有助于我们写出 更优秀的 产品 出来. 什么是HTML? HTML 是用来描述网页的一种语言. HTML 包含一些根节点,子节点,文本节点,属性节点,组成, 它通过一系列预定义标签来描述网页结构,如: <title>This is title</title> ,这个表明该网页的标题是 This is title. 什么是CSS? CSS 指层叠样式表 (Cascading Style Sheets),它描述浏览器显示如何显示htm

java进阶06 线程初探

线程,程序和进程是经常容易混淆的概念. 程序:就是有序严谨的指令集 进程:是一个程序及其数据在处理机上顺序执行时所发生的活动 线程:程序中不同的执行路径,就是程序中多种处理或者方法. 线程有两种方法实现 一:继承Thread 覆盖run方法 package Thread; public class Thread1 { public static void main(String[] args){ MyThread1 thread1=new MyThread1(); thread1.setName

数据加密解密初探

在一次网络通信或者是进程通信中,如果传输数据采用明文的方式,那么很容易被第三方"窃听"到,安全性难以保障. 而所谓加密是让数据从明文变成密文,传输过程中是密文,传送过去之后对方接收到的也是密文.--可以理解为密文就是乱码,看不出内在的任何意义,通常也都是逐位对应的. 在接收方接收到密文之后只有把它还原为原来的样子才可以理解对方说的具体是什么,此过程就叫做解密. 所谓系统的安全要实现的目标应该包括:机密性-confidentiality,完整性-integrity 和可用性-availa

Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性,不得不说下Http协议.我们常常听到说,Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.之所以我们在使用ASP.NET WebForm开发中会感觉不到Http的无状态特