更多的流程定义描述符概念

原创 2005年05月29日 14:50:00

h3 定义条件和函数

你也许已经注意到,到目前为止,我们定义的条件和函数类型都是“class”。这种类型的条件和函数接受一个参数:“class.name”,以此来指明一个实现FunctionProvider或Condition接口的完整类名。

在osworkflow里面也有一些其他内置的类型,包括beanshell,无状态的session bean,JNDI树上的函数等。我们在下面的例子里使用beanshell类型。

h3 Property sets

我们可能需要在工作流的任意步骤持久化一些少量数据。在osworkflow里,这是通过OpenSymphony的PropertySet library来实现。一个PropertySet基本上是一个可以持久化的类型安全map,你可以添加任意的数据到propertyset(一个工作流实例对应一个propertyset),并在以后的流程中再读取这些数据。除非你特别指定操作,否则propertyset中的数据不会被清空或者被删除。任意的函数和条件都可以和propertyset交互,以beanshell script来说,可以在脚本上下文中用“propertyset”这个名字来获取。下面来看具体写法是怎么样的,让我们增加如下的代码在“Start First Draft”动作的pre-functions里面:

<function type="beanshell">
  <arg name="script">propertySet.setString("foo", "bar")</arg>
</function>

这样我们就添加了一个持久化的属性“foo”,它的值是“bar”。这样在以后的流程中,我们就可以获得这个值了。

h3 Transient Map 临时变量

另外一个和propertyset变量相对的概念是临时变量:“transientVars”。临时变量是一个简单的map,只是在当前的工作流调用的上下文内有效。它包括当前的工作流实例,工作流定义等对应值的引用。你可以通过FunctionProvider的javadoc来查看这个map有那些可用的key。

还记得我们在教程的第2部分传入的那个null吗?如果我们不传入null的话,那么这些输入数据将会被添加到临时变量的map里。

h3 inputs 输入

每次调用workflow的动作时可以输入一个可选的map,可以在这个map里面包含供函数和条件使用的任何数据,它不会被持久化,只是一个简单的数据传递。

h3 Validators 校验器

为了让工作流能够校验输入的数据,引入了校验器的概念。一个校验器和函数,条件的实现方式非常类似(比如,它可以是一个class,脚本,或者EJB)。在这个教程里面,我们将会定义一个校验器,在“finish first draft”这个步骤,校验用户输入的数据“working.title”不能超过30个字符。这个校验器看起来是这样的:
package com.mycompany.validators;

public class TitleValidator implements Validator
{
  public void validate(Map transientVars, Map args, PropertySet ps) 
        throws InvalidInputException, WorkflowException
  {
    String title = (String)transientVars.get("working.title"); 
    if(title == null)
      throw new InvalidInputException("Missing working.title");
    if(title.length() > 30)
      throw new InvalidInputException("Working title too long");
  }
}

然后通过在流程定义文件添加validators元素,就可以登记这个校验器了:

<validators>
  <validator type="class">
    <arg name="class.name">
      com.mycompany.validators.TitleValidator
    </arg>
  </validator>
</validators>

这样,当我们执行动作2的时候,这个校验器将会被调用,并且检验我们的输入。这样在测试代码里面,如果加上:

Map inputs = new HashMap();
inputs.put("working.title", 
  "the quick brown fox jumped over the lazy dog," +
  " thus making this a very long title");
workflow.doAction(workflowId, 2, inputs);

我们将会得到一个InvalidInputException,这个动作将不会被执行。减少输入的title字符,将会让这个动作成功执行。

我们已经介绍了输入和校验,下面来看看寄存器。

h3 Registers 寄存器

寄存器是一个工作流的全局变量。和propertyset类似,它可以在工作流实例的任意地方被获取。和propertyset不同的是,它不是一个持久化的数据,而是每次调用时都需要重新计算的数据。

它可以被用在什么地方呢?在我们的文档管理系统里面,如果定义了一个“document”的寄存器,那么对于函数、条件、脚本来说就是非常有用的:可以用它来获得正在被编辑的文档。

寄存器地值会被放在临时变量(transientVars map)里,这样能够在任意地方获得它。

定义一个寄存器和函数、条件的一个重要区别是,它并不是依靠特定的调用(不用关心当前的步骤,或者是输入数据,它只是简单地暴露一些数据而已),所以它不用临时变量里的值。

寄存器必须实现Register接口,并且被定义在流程定义文件的头部,在初始化动作之前。

举例来说,我们将会使用一个osworkflow内置的寄存器:LogRegister。这个寄存器简单的添加一个“log”变量,能够让你使用Jakarta的commons-logging输出日志信息。它的好处是会在每条信息前添加工作流实例的ID。

<registers>
  <register type="class" variable-name="log">
    <arg name="class.name">
      com.opensymphony.workflow.util.LogRegister
    </arg>
    <arg name="addInstanceId">true</arg>
    <arg name="Category">workflow</arg>
  </register>
</registers>

这样我们定义了一个可用的“log”变量,可以通过其他的pre-function的脚本里面使用它:

<function type="beanshell">
  <arg name="script">transientVars.get("log").info("executing action 2")</arg>
</function>

日志输出将会在前面添加工作流实例的ID

h3 结论

这个教程的目的是希望可以阐明一些主要的osworkflow概念。你还可以通过API和流程定义格式去获取更多的信息。有一些更高级的特性没有在此提到,比如splits 分支、joins 连接, nested conditions 复合条件、auto stpes 自动步骤等等。你可以通过阅读手册来获得更进一步的理解。

如果你遇到任何的困难,可以在osworkflow的email list上询问。

软件性能测试基本概念和流程

1.1    软件性能的定义 通常来说,性能首先是一种指标,表明软件系统或构件对其即时性要求的符合程度;其次是软件产品的的一种特性,可以用时间来进行衡量。性能的及时性用响应时间或吞吐量来衡量...
  • jiangbqing
  • jiangbqing
  • 2017年01月12日 11:53
  • 1048

【Activiti工作流】7.流程定义的CRUD(下)

上一篇我们学习了工作流定义的操作,包括: 1.管理流程定义(流程图) 2.部署流程定义(classpath路径加载文件) 3.查看流程定义 4.删除流程定义 也即是,我们学习了流程的增加/查看/删除...
  • u013517797
  • u013517797
  • 2017年03月12日 20:15
  • 1313

数据挖掘:概念与技术(第三版)之第七章的学习记录

在第六章我们讲了频繁模式的挖掘,本章主要讲高级模式挖掘。 模式挖掘相对于频繁模式挖掘来说,是一个更一般的术语。就是说模式挖掘不仅包括了频繁模式挖掘还包括了如稀有模式,负模式。然后,很多情况下,这两个...
  • u014593570
  • u014593570
  • 2017年07月14日 09:17
  • 467

java.sql.SQLException: 无法从套接字读取更多的数据出现的原因

今天测试数据库出现 java.sql.SQLException: 无法从套接字读取更多的数据 java.sql.SQLException: 无法从套接字读取更多的数据...
  • xiaopeng187
  • xiaopeng187
  • 2014年05月14日 14:42
  • 10100

使用Oracle SQL Developer提示无法从套接字获取更多数据如何解决

将oracle?安装目录下的Network/admin/listener.ora文件中的 (PROGRAM = extproc)注释掉 # listener.ora Network Configur...
  • wangl2014
  • wangl2014
  • 2016年12月07日 15:01
  • 2546

Activiti入门学习demo_1_流程定义和发布

环境参照另一个博客中  @Test     public void testProcessDefinition() {         // 创建 Activiti流程引擎         P...
  • zhuchunyan_aijia
  • zhuchunyan_aijia
  • 2016年06月14日 17:46
  • 500

java.sql.SQLException: 无法从套接字读取更多的数据

本来订单的生成没有问题,但不知什么原因,报了一个这样的异常,致使订单不能生成  [08-11-19 8:07:51:344 CST] 00000037 JDBCException E   could ...
  • OnlyOfMe
  • OnlyOfMe
  • 2008年11月19日 13:34
  • 19311

异常 java.sql.SQLException: 无法从套接字读取更多的数据

使用hibernate执行查询时,报如下异常:Caused by: java.sql.SQLException: 无法从套接字读取更多的数据 at oracle.jdbc.driver.SQLStat...
  • Chen_yu_ting
  • Chen_yu_ting
  • 2011年05月26日 17:19
  • 10049

0x000006D9: 终结点映射器中没有更多的终结点可用。 。

0x000006D9: 终结点映射器中没有更多的终结点可用。 。
  • dragoo1
  • dragoo1
  • 2014年06月30日 16:41
  • 10109

流程、活动、工作项的定义

业务流程(WorkFlow template):通过工作流定义工具建立的一个流程模板 流程定义ID:指的是在studio中创建的流程模版的ID,唯一标示一个流程; 活动(Activity):...
  • zh521zh
  • zh521zh
  • 2015年03月19日 19:30
  • 770
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:更多的流程定义描述符概念
举报原因:
原因补充:

(最多只允许输入30个字)