jBPMの状態をJRubyで転がしてみる

id:n_shuyoさんの情報を見てたらJRubyを試したくなって、せっかくなので簡単なjBPMのプロセスを定義して、そのプロセスをjirbで対話で状態を遷移してみた。思いのほか簡単。JRuby1.0.3をインストール.JRUBY_HOMEとPATHをセット。

んで次に簡単に試すのにJava側でFactoryクラスを用意して単純なプロセス定義からプロセスインスタンスの生成を行なうようにした。クラスはこんな感じ。

public class ProcessInstanceFactory {

 public static ProcessInstance get() {
		
  ProcessDefinition pd = ProcessDefinition.parseXmlString(
   "<process-definition>" +
   "  <start-state name='start'>" +
   "    <transition to='a' />" +
   "  </start-state>" +
   "  <state name='a'>" +
   "    <transition to='b' />" +
   "  </state>" +
   "  <state name='b'>" +
   "    <transition to='c' />" +
   "  </state>" +
   "  <state name='c'>" +
   "    <transition to='end' />" +
   "  </state>" +
   "  <end-state name='end'/>" +
   "</process-definition>"
  );

    ProcessInstance pi = new ProcessInstance( pd );
   return pi;
  }
}

でこれだけでjarにする。jBPM.cfg.xmlを空設定で用意してそれもjarにしまっとく。んでこのjarとjBPMの関係ライブラリのjbpm-jpdl.jar,commons-logging.jar,dom4j.jarにclasspathを通して、「jirb」とコマンドプロンプトでポチっとな。

irb(main):001:0> require 'java'
=> false
irb(main):002:0> import 'com.waki.ProcessInstanceFactory'
=> ["com.waki.ProcessInstanceFactory"]
irb(main):003:0> pi = ProcessInstanceFactory.get
2008/02/15 2:24:51 org.jbpm.JbpmConfiguration getInstance
情報: using jbpm configuration resource 'jbpm.cfg.xml'
2008/02/15 2:24:52 org.jbpm.persistence.db.StaleObjectLogConfigurer hideStaleObj
ectExceptions
情報: stale object exceptions will be hidden from logging
=> #<Java::OrgJbpmGraphExe::ProcessInstance:0x1493102 @java_object=org.jbpm.grap
h.exe.ProcessInstance@302e67>

ここまででpiの変数はjavaで用意したプロセスインスタンスを参照しています.書かないけど、pi.methodsとうつとメソッドがものすごく表示された。リフレクション操作は簡単だなぁ。。。

で、実際に状態を遷移させていく。

irb(main):004:0> pi.signal
=> nil
irb(main):005:0> pi.rootToken.node.to_s
=> "State(a)"
irb(main):006:0> pi.signal
=> nil
irb(main):007:0> pi.rootToken.node.to_s
=> "State(b)"
irb(main):008:0> pi.signal
=> nil
irb(main):009:0> pi.rootToken.node.to_s
=> "State(c)"
irb(main):010:0> pi.signal
=> nil
irb(main):011:0> pi.rootToken.node.to_s
=> "EndState(end)"

signalで遷移させてnodeの中身が遷移しているのがよくわかる。って感じ。んでもって、JRubyは簡単に試せるのがよくわかった。もうちょっといろいろやってみたいと思う。更に改めて「対話」というものを考えさせられた。うん、いいよ、対話。