ruoteとは
ruoteはRubyで実装されたオープンソース(MITライセンス)のワークフローエンジンだ。プロセス定義はRuby DSL、XML、JSONのいずれかで記述することができる。
ruoteは以下のようにgemコマンドでインストールすることができる。本稿執筆時点の最新版は2.1.11となっている。
gem install ruote
シンプルなワークフローの例
ruoteのWebサイトに掲載されているquickstartのサンプルを例にruoteの使い方を見てみよう。以下のコードは:alphaと:bravoの2つのパーティシパントをシーケンシャルに呼び出すだけのシンプルなワークフローを実行するものだ。
require 'rubygems'
require 'ruote'
require 'ruote/storage/fs_storage'
# エンジンの準備
engine = Ruote::Engine.new(
Ruote::Worker.new(Ruote::FsStorage.new("ruote_work")))
# パーティシパントの登録
engine.register_participant :alpha do |workitem|
workitem.fields['message'] = { 'text' => 'hello !', 'author' => 'Alice' }
end
engine.register_participant :bravo do |workitem|
puts "I received a message from #{workitem.fields['message']['author']}"
end
# プロセスの定義
pdef = Ruote.process_definition :name => 'test' do
sequence do
participant :alpha
participant :bravo
end
end
# 実行
wfid = engine.launch(pdef)
engine.wait_for(wfid)
ruoteのワークフローはパーティシパントとプロセス定義からなる。パーティシパントはワークフロー中で何らかの処理を行うためのものでRubyコードで実装する。プロセス定義はパーティシパント間のフローを定義するもので、RubyベースのDSLのほか、XMLやJSONで定義することもできる(ツールとの連携を考慮するとDSLよりもXMLやJSONのほうが望ましいケースもあるだろウ)。
上記のサンプルコードを実行するとコンソールには以下のように出力される。1つめのパーティシパントでworkitemにセットした文字列を2つめのパーティシパントで取り出してコンソールに表示している。
> ruby ruote_quickstart.rb
I received a message from Alice
ここでは非常にシンプルな例のみを紹介したが、ruoteではもちろん条件分岐やエラー処理、並列実行などを組み込んだ複雑なプロセスを定義したり、サブプロセスとして別のプロセスを起動したりすることも可能だ。また、リモートサーバに配置されているRubyスクリプトやXMLファイルを指定してプロセスを起動することもできる。
なお、ruoteが実行中プロセスの状態の永続化に使用するストレージ(上記のサンプルではFsStorageを使用している)には標準でいくつかの実装が提供されている。高速だが機能制限のあるインメモリの実装、ファイルシステムに永続化を行う実装など、用途にあわせて適切なものを選択することができるほか、自分で実装したストレージを使用することも可能だ。
手軽に利用可能なワークフローエンジン
ワークフローエンジンというとエンタープライズ向けのものという印象が強いが、ruoteはライブラリ感覚で利用することができるうえ、プロセスの定義もRubyスクリプトで行うことができるため、導入も容易で手軽にワークフローを実現することができる。Rubyベースのアプリケーションでちょっとしたワークフローが必要という場合にはruoteの利用を検討してみてほしい。