2016-05-06 5 views
1

WSO2ESBのシーケンス呼び出しの間に状態を保存する正しい方法については不思議でした。言い換えれば、シーケンスSを呼び出すスケジュールされたタスクがある場合、反復0の終わりに、私はString変数をいくつか格納したい(それをIDと呼ぶ)し、次にこのIDを最初に読みたい反復1の途中)、等々。WS2ESB:シーケンス呼び出し間の状態を保存する

より正確には、既存のサービスであるTwilioから新しいSMSメッセージのリストを正確に取得したいと考えています。ただし、Twilioは選択した日のみメッセージを受け取ることができます。つまり、特定のメッセージIDよりも最後にチェック/新しかったので、私に新しいメッセージだけを伝える方法はありません。したがって、Twilioにクエリを実行し、に新しいメッセージを渡す予定のタスクを作成したいと思います。これを行うために、私のシーケンスはTwilioに問い合わせを行い、返されたメッセージのリストを調べ、前の呼び出しですでに報告されたメッセージを破棄する必要があります。これを行うためには、異なるタスク/シーケンス呼び出しの間にある状態を格納する必要があります。つまり、シーケンスの最後に、最新のメッセージのIDを現在のバッチに格納する必要があります。その後、このIDを後続の呼び出しで使用して、前の呼び出しですでに報告されたメッセージを判別することができます。

私はDBLookupとDB Reportメディエータを使用することができましたが、パフォーマンスはあまり高くなく、過度の(データベースを使用して単一の文字列を格納する)ようです。一方、Classメディエータはシングルトンとしてインスタンス化されているので、この状態を管理し、私のサービスに送信されるメッセージのリストをフィルタリングするカスタムClassメディエータを作成することができます。私はこれがうまくいくと確信していますが、これが道のりであるか、私が逃したよりエレガントな解決策があるのだろうかと思いました。

答えて

1

ここでは3つのオプションが考えられます。 DBLookup /レポートを使用して

  1. あなたは状態を保持して読み取るために、カスタムメディエーターを使用して
  2. (これは再びバックエンドでのDBを使用しています)の値を格納するためのカーボンレジストリを使用して
  3. を提案してきたように/これから/からプロパティに書き込む

これら3つのうち、明らかに第3のものはすべてがメモリ内にあるので、最高のパフォーマンスを提供します。それはまた実装するのがかなり簡単で、いつか戻って、私は何か似たようなことをやった。wrote a blog post here

一方、最初の2つのオプションは、ユースケースの懸念がある場合は、サーバーがクラッシュしても状態を維持できます。

+0

ありがとうございます。私は状態のスレッドの安全性を確保する必要がありますね。状態が単なる文字列の場合は正常に動作すると思われますが、一般的に状態が複雑な場合は、おそらく同期が整っていると思われます。あるいは、フレームワークは、複数のスレッドによってmediateメソッドが並列に実行されないことを保証しますか? –

0

esb 490では、プロパティメディエータを使用してレジストリからプロパティを永続化して読み込むことができます。

https://docs.wso2.com/display/ESB490/Property+Mediator

+0

私はこのドキュメントを見てきましたが、レジストリ内のプロパティを保持する方法を理解することはできません...そのページ内に「レジストリ」という単語を見つけることさえできません。あなたの答えにサンプルを追加できますか? –

+0

ここに同じ、そのドキュメントのレジストリについての単語を見つけることができませんでした。私が知る限り、プロパティ・メディエータはメッセージ・コンテキストのみで動作します。したがって、設定されたプロパティーは、レスポンスがクライアントに返されるまで(または選択されたスコープによってはさらに少なくなるまで)存続できます。 –

関連する問題