因爲最近本身寫點小東西,須要有工做流程管理方面的應用,全部的環境爲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熟悉的朋友共同窗習。