ODCのEvent Driven Architectureが発表され、すでに利用可能になったので動作確認してみる。
これまでも、Blockには内部で発生した変化を配置先のUIに通知するEventという仕組みがあった。プログラムの観点からは、このEventを、Blockから独立した要素として公開できるようにしたものがEvent Driven Architecture。
環境情報
ODC Studio(Version 1.4.0)
ドキュメント
Release Notes
OutSystems Developer Cloud 2024-03-12のNew
It is now possible to publish and consume events between ODC applications. (RRCT-5536)
ODC Studio 1.4.0のNew in ODC Studio 1.4.0
It is now possible to publish and consume events between ODC applications. (RDEV-6423)
用語
Event
App内で発生した何らかの変化を表す要素。
ODC StudioのProcessesタブ > Eventsフォルダに作成する。
Eventを発生させた側とは独立に、非同期に発生する(発生側の処理は、Eventの処理を待たずにそのまま続行する)。
Trigger
Eventを発生させること。
サーバー側のActionから、Trigger Eventという要素を実行することで行う。
Event Handler
Eventが発生したときに動作するServer Action。
Input Parameterとして、基本データ型とEntity Identifierが使える。
Subscribe
利用側のAppから、Eventの発生を待ち受ける登録をすること。
Eventに対するEvent Handlerを設定してPublishすることで行う。
ドキュメントによると、この参照は弱い参照。
チュートリアル
シナリオ
- ユーザーが大きなファイルをアップロード
- アップロードされたファイルを処理する
- 処理が終わったら、UIに結果を表示する
というシナリオを考える。
このとき、2.のステップに相当時間がかかると、Server Request Timeoutにかかってエラーになってしまう。
そこで、Eventを使ってこの部分を非同期に処理してみる。
ファイル保存Entity
アップロードされたファイルを格納しておくBinaryData Attributeのみを持つEntityを用意しておく。
Event作成
ODC StudioのProcessesタブを開き、Eventsフォルダを右クリック。「Add Event」を選択してEventを作成。
作成したEventのプロパティ。Name/Description/Publicは他の要素の同名項目と同じ。Handlerには、そのEventが発生したときに動作するServer Actionを設定できる。Server Actionなので同じApp内のものしか設定できない(他のAppからSubscribeするには、Public=Yesにする)。この項目は必須ではない。
EventをTriggerする
Eventを発生させるには、サーバー側の処理中でTrigger Event要素を呼び出す。
これまでも、Block内からEventを発生させるときに行っていたのと同じ手順。
Event Handler
Eventで定義したInput Parameterを受け取ること以外は、通常のServer Actionとして作成すれば良い。
ログの確認
①Buttonクリック時に起動されるClient Action
②①から起動されるServer Action(EventをTriggerする)
③Event HandlerとなるServer Action
の開始・終了のタイミングでLog Messageを実行させ、ODC Portal上のLogsを確認した。
Triggerする側とEvent Handlerは非同期に実行されることが確認できた
自動で記録されるログ
以下のログが自動でODC Portalに出力されるようだ
- EventがTriggerされたことを示すログ
- EventがHandleされたことを示すログ
- Eventの処理が終了したことを示すログ
他のAppからSubscribeできる
他のAppから、Eventを参照して利用することもできる。
その場合は、Consumer側のServer Actionを1つだけHandlerとして指定できた。
なお、LibraryからはEventを参照できなかった。
EventをTriggerさせてみると、ここまでにSubscribe下2つのHandlerが両方動作した。