"bpelx:replay"フォルトによるBPELアクティビティの再実行

ビジネス・プロセスでは、例外発生時に実行済みの処理を再実行したい場合があります。ですが、BPELプロセスにおける通常のフォルト処理(例外処理)では、実行済みのアクティビティを再実行することは、簡単にはできません。

正確には、ループとカスタムのフラグを併用すれば、不可能ではありません。たとえば、次のようにします。ループの中にを入れます。カスタムのフラグとして、boolean型などの適当なBPEL変数を作っておきます。の条件式にこのフラグを使って、通常は1回のループで脱出させます。(内でフォルトがスローされたときに実行される)のフォルト・ハンドラでは、このフラグを書き換えて、再度ループが実行されるようにします。

これで、めでたくフォルト発生時に内の処理を再実行できました。ですが、この手法は少し面倒ですし、あまりスマートではありませんね…。

そこで、登場するのがBPEL PM固有のフォルト"bpelx:replay"です。これを使うことで、BPELプロセスの再実行をスマートに定義できます。このフォルトがスローされると、Oracle BPEL Process Manager(BPEL PM)はそのフォルトを包含する一番内側のスコープを始めから再実行します。

例として、BPEL PM付属のサンプル・プロセスを紹介します。このサンプルは、/integration/orabpel/samples/references/Replayディレクトリにあります。

BPELファイル ReplayFault.bpelの一部を引用して、コメントを追加してみます。



 <!-- カウンタを0で初期化 -->
 
  
   
   
  
  

  
   

    <!-- 5秒スリープ -->
    

    <!-- カウンタをインクリメント -->
    
     
      
      
     
    

    

     <!-- カウンタが3より大きかったら、何もせずそのまま次へ -->
     
      
     

     <!-- カウンタが3以下だったら、bpelx:replayフォルトをスローし -->
     <!-- スコープの冒頭から再実行 -->
     
      
     
    
   
  

このプロセスを実行すると、スコープが4回実行されます。