罗列一下表达式所支持的属性:

  • :timeout
  • :if/ unless
  • :forget
  • :lose
  • :flank
  • :on_error
  • :on_cancel
  • :on_timeout
  • :tag
  • :filter
  • :take
  • :discard
  • :timers
  • :scope
  • :await

:time

         下面举个例子,如果两个参与者过两天之后还没有做他们的工作,这个工作流程会提交给editor:

 sequence do
participant :ref => 'author'
sequence :timeout => '2d' do
participant :ref => 'reviewer1'
participant :ref => 'reviewer2'
end
participant :ref => 'editor'
end

:time不仅能够处理h,m,d,s(依次表示hour,minute,day,second)模式的时间定义,而且能够处理y,M,w(分别表示year,Month,week)的模式。

就算是你给timeout传递一个绝对时间也没有问题,完全能够处理:

 participant :ref => 'author', :timeout => 'Sun Jan 24 17:28:28 +0900 2010'

在真实的项目中,timeout的参数一般都是取自工作流程中的变量或者传递进来的参数。

 participant :ref => 'author', :timeout => '${f:time_limit}'

 :if/ :unless

这两个属性接收一个字符串的条件,如果这个字符串的值是true(或者:unless的参数的值是false),表达式就会执行,看下面的列子:

 concurrence do
participant 'ceo', :if => '${f:budget} > 23000'
participant 'cfo'
participant '${f:bu_head}'
end

这个意思就是:如果这个工作流程中的预算配置大于23000,那么CEO就会收到一个工作流程的任务。:if :unless条件能够处理!=、==、=~、"is set"、"is empty"、&&、||等操作符。

:forget

当一个表达式用:forget=>true 或者:forget=>'true',获取将要被“遗忘”的操作。被“遗忘”操作的返回值将被忽略:

 concurrence do
participant 'alfred'
participant 'bob'
participant 'charly', :forget => true
end

charly将会收到一个工作流程,同时concurrence立即收到一个回复。就是说在Alfred和Bob回复了以后,concurrence就会恢复。

:lose

从来不向他的父表达式回复,

 Ruote.process_definition do
concurrence :count => 1 do
alfred
lose do
sequence do
wait '2d'
send_reminder_to_alfred
wait '2h'
send_alarm_to_boss
end
end
end
end

像这个列子中,reminding从来不向concurrence 回复。concurrence在alfred回复以后就结束了。

:flank

前面的lost中的列子可以用下面这段代码重写:

 Ruote.process_definition do
sequence do
sequence :flank => true do
wait '2d'
send_reminder_to_alfred
wait '2h'
send_alarm_to_boss
end
alfred
end
end

Flanking表达式会立刻向他的父表达式返回,但是仍然可以取消,因为Flanking表达式可以取消,所以他们的生命周期肯定不会比他的父表达式长。

 Ruote.process_definition do
sequence do
bob :task => 'support work', :flank => true
alfred :task => 'main effort'
end
end

所以在这个例子中,在alfred完成他的'main effort'任务,bob的'support work'即将终止,因为他的父表达式已经结束了。

下面概括一下forget, lose and flank的区别:

:on_error

默认情况下,在一个工作流程中发生的任何的任何错误都能获取日志和发生错误的地方。在过程定义的时候直接指定“on error”的行为:

 Ruote.define :name => 'x' do

   sequence :on_error => 'handle_issue' do
participant 'alpha'
cursor do
# ...
end
end define 'handle_issue' do
participant 'supervisor', :msg => 'process ${wfid} has gone ballistic'
end
end

如果在sequence 中发生错误,那么sequence 整个分支就会取消,:on_error必须指定一个子过程或者一个参与者或者像“redo”, “undo”, “cancel”这些命令。

:on_cancel

on_cancel是用来指定一个子过程或者参与者,当当前过程取消的时候,设置的子过程会被调用,或者参与者收到一个工作条目。

pdef = Ruote.process_definition :name => 'aircraft carrier' do
cursor :on_cancel => 'decommission' do
concurrence do
participant 'naval team', :task => 'operate ship'
participant 'air team', :task => 'operate planes'
end
end
define 'decommission' do
concurrence do
participant 'naval team', :task => 'decom weapons'
participant 'air team', :task => 'decom aircrafts'
end
end
end

上面这个过程中, “the aircraft”是一个操作,当操作取消的时候,子过程‘decommission’被触发,里面的naval team和air team获取对应的任务。

和:on_error有点不一样的是,当一个表达式在:on_cancel表达式中被取消掉的话,将不会触发:on_cancel.例如上面的列子中“operate planes”这个活动的取消不会激活‘decommission’。只有cursor或者整个过程实例被取消的时候才能触发‘decommission’。

:on_timeout

上面描述的了:timeout属性。:on_time属性是一个补充,它表示在timeout触发的时候调用什么子过程,或者通知某个参与者。除了子过程和参与者者,:on_timeout还可以使用‘redo’,‘error’作为值。

 sequence do
participant 'author'
participant 'reviewer', :timeout => '3d', :on_timeout => 'redo'
participant 'editor'
end

在这个列子中,reviewer每3天收到一个新的工作条目,直到他回复了这个工作流程。回复了之后将回复到editor参与者。

:tag

tag属性用来标记一个工作过程的一个阶段。

 Ruote.process_definition do
sequence do
sequence :tag => 'phase 1' do
alice
bob
end
sequence :tag => 'phase 2' do
charly
david
end
end
end

例子中的tags将出现在工作流程的变量中:

p engine.process(wfid).tags.keys
# => [ "phase 1" ]

:filter

Ruote2.2.0引进了一个:filter属性。

 Ruote.process_definition do

   set 'v:f' => {
:in => [
{ :fields => '/^private_/', :remove => true }
],
:out => [
{ :fields => '/^private_/', :restore => true },
{ :fields => '/^protected_/', :restore => true },
]
} alpha
sequence :filter => 'f' do
bravo
charly
end
delta
end

在这个例子中,filter被保存在变量f中,当过程经过alpha进去sequence的时候,调用filter的in端,这个工作条目中以”private_“开始的内容被移除,接下来的bravo,charly不能够访问。当charly执行完成以后,调用dilter的out端的流程。

:take and :discard

:timers

这个比较好理解,下面看一个列子:

 Ruote.define do
# ...
alice :timers => '5d: reminder, 12d: final_reminder, 15d: timeout'
# ...
end

这个例子表示为,alice收到一个任务,她有15天来完成她,在5天以后她会收到一个提醒,在12天以后会收到一个最后一次提醒。模式为"时间段1:action1,时间段2:action2,....,时间段3:action3"。actionx可以是一个参与者的名字,也可以是一个子过程,或者一组定义好的关键字。

timeout:

 alice :timers => '1h: timeout'
# is equivalent to
alice :timeout => '1h'

error:过来给定的时间,表达式强制转换成error

 alice :timers => '1h: reminder, 12h: error'

在从error结束开始,到字符串的末尾或者附近的一个逗号中的字符串是错误信息。

undo, pass

 alice :timers => '1h: reminder, 12h: error it went wrong'

在指定的12个小时内没有完成工作,那么就忽略alice了,转交给bravo.

redo,retry

 alice :timers => '12h: redo'
# which is equivalent to
alice :timeout => '12h', :on_timeout => 'redo'

skip,back,jump.rewind,continue,break,stop,over,reset这些命令都可以执行。

:scope

默认情况下,一个工作流程中的变量在相同的范围,通过:scope属性,来创建新的访问范围

 define 'flow' do
set 'v:v' => 'alice'
sequence :scope => true do
set 'v:v' => 'bob'
participant '${v:x}' # will deliver to bob
end
participant '${v:x}' # will deliver to alice
end

例子中就是创建一个”局部“范围来定义了set 'v:v' => 'bob'。

:await

await的引进是为了帮助模块的有向图。就是等待依赖的工作完成,自己在执行。

 concurrence do
sequence :tag => 'ab' do
a
b :tag => 'b'
end
sequence do
await :left_tag => 'ab'
c
end
sequence do
await :left_tag => 'b'
d
end
end

这个例子就是c要执行需要得ab执行结束之后才能执行,b执行完之后d才能执行。

workflow engine Ruote初体验之二(通用属性)的更多相关文章

  1. workflow engine Ruote初体验之一(概念)

    由于最近自己写点小东西,需要有工作流程管理方面的应用,所有的环境为Ruby on rails,所有在选择流程引擎的时候选择了ruote,但是对于ruote是完全陌生的,所以在这里记下点滴,如果理解的不 ...

  2. workflow engine Ruote初体验之三(条件与美元符号)

    条件 我们可以用:if和:unless公共属性来进行条件判断,或者使用if,given,once或者equals(已经过时)关键字. 使用:if属性: 1 cursor do 2 participan ...

  3. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...

  4. Java8初体验(二)Stream语法详解---符合人的思维模式,数据源--》stream-->干什么事(具体怎么做,就交给Stream)--》聚合

    Function.identity()是什么? // 将Stream转换成容器或Map Stream<String> stream = Stream.of("I", & ...

  5. Java8初体验(二)Stream语法详解

    感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验(一)lambda表达式语法比 较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例 ...

  6. Ubuntu下Django初体验(二)——创建工程及应用

    一.工程目录详解 创建工程后得到如下目录: 1. manage.py 管理项目.创建数据库.启动服务器等.测试等. 查看子命令: python manage.py 启动服务器: python mana ...

  7. MEF初体验之二:定义组合部件和契约

    组合部件 在MEF中,一个组合部件就是一个组合单元,组合部件"出口"其它组合部件需要的服务并且从其它部件"进口"需要的服务.在MEF编程模型中,为了声明组合部件 ...

  8. SpringCloud初体验:二、Config 统一配置管理中心

    Spring Cloud Config : 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. 配置中心也区分为服务端和客户端,本次体 ...

  9. workflow engine Ruote 安装

    今天在安装gem安装Ruote的过程中遇到问题,改用bundle安装: steven@steven-Latitude-D630:/usr$ sudo mkdir bundel [sudo] passw ...

随机推荐

  1. LoadRunner11的安装和使用及其注意点(测试系统是win7)

    一.安装 LoadRunner11的下载地址:http://www.ddooo.com/softdown/61971.htm 链接标题里[loadrunner11 中文破解版]实质上下载下来是没有破解 ...

  2. JS的跨域理解

    前言 周一的学院点开题被批的很惨,换了个校长,各种被抓严,班上已经有两个同学打算休学了.哎,这周的聚会可能是大家集聚的最后一次吧.熬着吧,还是学习我的前端,不管老板学校咋逼了,找个好工作才是王道.今天 ...

  3. OpenStack之虚机热迁移

    OpenStack之虚机热迁移 最近要搞虚机的热迁移,所以也就看了看虚机迁移部分的内容.我的系统是CentOS6.5,此处为基于NFS共享平台的虚机迁移.有关NFS共享服务器的搭建可以看这里. Yak ...

  4. 在IE浏览器下,PDF将弹出窗口遮挡了

    写了个embed标签里面放这个pdf 然后点击其他地方的弹框pdf把他遮盖住了 如下: 先是改z-index,没卵用. 百度了好久,终于找到了个有用的 https://blog.csdn.net/it ...

  5. linux配置Hadoop伪分布安装模式

    1)关闭禁用防火墙: /etc/init.d/iptables status 会得到一系列信息,说明防火墙开着. /etc/rc.d/init.d/iptables stop 关闭防火墙 2)禁用SE ...

  6. 【转】网页游戏能用PHP做后端开发吗? PHP Libevent扩展安装及应用

    网页游戏能用PHP做后端开发吗? 当然可以.最好走HTTP,也可以做网络编程,而且写代码超简单,1个函数就可以建一个服务器端.stream_socket_server()多线程不是什么好主意,你可以用 ...

  7. springdata jpa

    (转自:http://www.cnblogs.com/ityouknow/p/5891443.html) 首先了解JPA是什么? JPA(Java Persistence API)是Sun官方提出的J ...

  8. vim 查找命令

    /要查找的内容      自光标起始位置向下查找 ?要查找的内容   自光标起始位置向上查找

  9. [SDOI2009][bzoj1877] 晨跑 [费用流]

    题面: 传送门 思路: 一个点只能走一回,路径不能相交...... 显然可以转化为网络流的决策来做 我们构建一个网络,令其最大流等于最大的跑步天数即可 怎么构造呢? 对于每个点只能走一次的限制,可以考 ...

  10. [luoguP2587] [ZJOI2008]泡泡堂(贪心)

    传送门 贪心,很像田忌赛马那样,但是因为有平局加一分导致那样的贪心不好处理. 先将两个数组从小到大排序. 比较a最大和b最大,如果a比b大,那么直接赢掉 否则 比较a最小和b最小,如果a比b大,那么直 ...