1

今のところ解決できない小さな問題があります。BPEL では、すぐに起動し (つまり、「for」要素が「PT0S」に設定されます)、2 秒ごとに繰り返される onAlarm eventHandler を作成したいと考えています。この eventHandler には、アラームが発生するたびに増加するカウンターが含まれます。

問題は、カウンターを初期化する方法です。変数が onAlarm スコープ内で初期化される場合、値はそれ以上増加しません。「通常の」制御フローでは、プロセスまたは onAlarm スコープが最初に実行されるかどうかが定義されていないため、値も初期化できません。そのため、時々 uninitializedVariable 例外が発生します。

私の解決策は、プロセス スコープでも onAlarm スコープでも変数を初期化せず、変数が初期化され、その後 onAlarm フローが実行される faultHandler を作成することです。問題は、すべての uninitializedVariable の実行がこの faultHandler によってキャッチされ、別のものが存在する可能性があることです。

この問題に対処する別の可能性はありますか、またはどの変数が適切に初期化されていないかをどうにかして見つけて、faultHandler が 2 つの制御フローを取得できるようにすることはできますか?

このソリューションは、すべての BPEL エンジンで機能するはずです。

ありがとう、マイケル

4

1 に答える 1

1

from-spec代入で likeを使用して、定義のデフォルト値で変数を初期化できます。詳細については、仕様のセクション 8.4.1 を参照してください。

デフォルトの初期化は次のようになります。

<variables>
    <variable name="Default" type="xsd:int" >
        <from>5</from>
    </variable>
</variables>

これはeventHandlers、プロセスの開始アクティビティが完了した後にインストールされるように機能するはずです。それまでに、ルート スコープで定義された変数は既に初期化されています。仕様を引用するには、セクション 12.1 :

スコープの初期化は、スコープの変数とパートナー リンクのインスタンス化と初期化で構成されます。... スコープに初期開始アクティビティが含まれている場合、イベント ハンドラーがインストールされる前に開始アクティビティを完了する必要があります。

仕様についてはこれで終わりです。これが「すべての BPEL エンジンで動作する」かどうかは誰にもわからないと思います。私の知る限り、bpel-g、Orchestrator、EasyBPEL では動作しますが、Apache ODE や OpenESB では動作しません。

于 2012-09-12T15:36:25.193 に答える