ruoteとは

ruoteはRubyで実装されたオープンソース(MITライセンス)のワークフローエンジンだ。プロセス定義はRuby DSL、XML、JSONのいずれかで記述することができる。

ruoteのWebサイト

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の利用を検討してみてほしい。