因为最近本身写点小东西,须要有工做流程管理方面的应用,全部的环境为Ruby on rails,全部在选择流程引擎的时候选择了ruote,可是对于ruote是彻底陌生的,因此在这里记下点滴,若是理解的不正确,还请你们批评指正。 redis
Ruote:用Ruby写的一个工做流引擎。sql
开始了解Ruote先要了解几个很重要的概念:mongodb
下面是一个Ruote的配置: apache
1 require 'ruote' 2 require 'ruote/storage/fs_storage' 3 4 engine = Ruote::Engine.new(Ruote::Worker.new(Ruote::FsStorage.new('work')))
这是一个最简单的配置,将engin,worker和storate包装在一块儿。json
Engine的配置选项其实是在初始化的时候传递给存储的,好比: 安全
1 require 'ruote' 2 require 'ruote/storage/fs_storage' 3 4 engine = Ruote::Engine.new( 5 Ruote::Worker.new( 6 Ruote::FsStorage.new( 7 'work', 8 'remote_definition_allowed' => true, 'ruby_eval_allowed' => true)))
也能够向下面这样定义:ruby
1 engine = Ruote::Engine.new( 2 Ruote::Worker.new( 3 Ruote::FsStorage.new('work'))) 4 5 engine.configure('remote_definition_allowed', true) 6 engine.configure('ruby_eval_allowed', true)
Engin的配置项:app
participant_threads_enabled(自从ruote2.3.0版本开始,默认状况是true)less
默认状况下, 从work中调度一个流程给参与者的时候都用一个新的Ruby线程。这样在默认状况下不会阻塞worker。学习
remote_definition_allowed(默认状况下是false)
Remote definitions 是经过Http协议过程定义。由于过程定义是代码,默认状况下用以下方法是不容许的:
1 Ruote.process_definition :name => 'main process' do 2 sequence do 3 subprocess 'http://example.com/definitions/head_process.rb' 4 subprocess 'http://example.com/definitions/tail_process.rb' 5 end 6 end 7 8 # or 9 10 engine.variables['head'] = 'http://example.com/definitions/head_process.rb' 11 engine.variables['tail'] = 'http://example.com/definitions/tail_process.rb' 12 13 Ruote.process_definition :name => 'main process' do 14 sequence do 15 head 16 tail 17 end 18 end 19 20 # or simply 21 22 engine.launch('http://example.com/definitions/main.xml')
若是要使用如上的定义,那么应该将‘remote_definition_allowed的选项设置为"true"。
ruby_eval_allowed:(默认是false)
wait_logger_max:(默认是147)
这个设置只是在开发测试环境中一个worker的状况,在其余环境下不用管这个配置。WaitLogger是ruote的一个组件,追踪147个最近的本地工做流程的处理信息。 preserve_configuration:(默认是false)
当这个配置设置为true的时候,engine,worker,storage将不向存储后面持续工做流程写配置。适用于多个工做流程一块儿运行的情境下。
restless_worker:(默认是false)
更像是一个工做流程的配置,当设置为true的时候,工做流程在提取信息和定时调度执行期间就不会sleep。
worker_state_enabled:(默认是false)
当设置为true的时候,将Ruote::Dashboard中的worker_state解锁,可能的状态包括running,paused,stopped.工做流读取状态执行相应的running,paused,stop操做。
engine on_error / on_terminate:
engine在发生错误和终止的时候触发的事件或者参与者,以下定义:
1 # you can pass a participant name 2 engine.on_error = 'administrator' 3 4 # or a subprocess name 5 engine.on_error = 'error_procedure' 6 7 # or directly a subprocess definition 8 engine.on_error = Ruote.define do 9 concurrence do 10 administrator :msg => 'something went wrong' 11 supervisor :msg => 'something went wrong' 12 end 13 end
目前为止,没有为worker的配置。
工做流、业务处理被人调用,持续好长时间,数据的持久性是必须的,storage用来保存数据。由于全部的工做流程共享storage,因此不只要提供可靠的持久数据,并且能够避免工做流之间的冲突。
下面这个表中是实现的storage类型:
multiple workers:storage是否支持多个工做流程。
remote worker:现实工做流程是否是和storage在一个主机上
speed :显示storage的速度排行。
一个字内存中临时的storage,不可以在多个工做流程中共享,大多数用于测试或者临时的工做流程。
以json的格式将ruote的信息保存成文件,能够在多个工做流程中共享数据。
基于redis的storage,很快,在多个工做流程的状况下使用。
通用的持久storage,使用Mysql或者PostgreSQL,在多个工做流程的状况下使用。
一个 DataMapper storage 实现。
一个基于 CouchDB 的Storage实现。
MongoDB storage 实现。
提供一种技术,使FsStorage能够被远程的工做流程可使用。
十分想找对ruote熟悉的朋友共同窗习。