JBossESBをひも解く(その1)
最近業務でJBossESBを使ってる。
基本的にはプログラマー'sガイド(JBoss ESB - Documentation Library - JBoss Community)を見て色々試してみてるんだけど・・・それだけではうまくいかないことも多くて、結局ソース読んで解析して・・・って感じになっている。
せっかくなのでその情報を残していければと思った。
とりあえず今回はorg.jboss.soa.esb.notification.Notifierについて。
org.jboss.soa.esb.notification.Notifier
NotifierについてはProgrammers Guideで説明されている。一言でいえば
「一度に複数の宛先へ、複数のプロトコルでデータを通知することが可能なクラス」
といったところだろうか。
関連するクラスを含めた構成はこんな感じ。
NotificationTargetを基底としたStrategyパターンになっている。
- NotifyConsole ・・・コンソールにデータを出力する
- NotifyTopics ・・・JMSのトピックに相当する(Publish/subscribeモデル)
- NotifyQueues ・・・JMSのキューに相当する(P2Pモデル)
- NotifyFiles ・・・ファイルへデータを書き出す
- NotifyFTP ・・・FTP転送する
- NogifyFTPList ・・・NotifyFTPの拡張。「N:1」転送を実現する。
で、実際にソースを見てて気をつけないといけないなと思ったこと。
◆Notifier
public Message process(Message message) { return message; } //________________________________ public void notifyOK(Message message) { NotificationList.notifyAll(_notifyOK, message); } //________________________________
なにが「気をつけないと」と言っているか分かるだろうか?
Notifierのソースを見てみるとprocess()では何も処理は実施せず、notifyOK()の時にNotificationList.notifyAll()が実施されている。
つまり、action pipelineが正常終了した時にはじめて通知処理が実施されることになる。
少し話が前後してしまうが、JBossESBにおけるaction pipelineのアーキテクチャはこのようになっている。
そのため、前述のようなことが言える。
ここで例えば
「対向サーバへファイルをFTP転送した後、「転送完了」とログ出力する」
といった要件があった場合に以下のような定義をしたとする。
<service name="ftpSend" description="" category="FTP" invmScope="GLOBAL"> <actions mep="RequestResponse"> <action name="ftpNotifier" class="org.jboss.soa.esb.actions.Notifier"> <property name="destinations"> <NotificationList type="ok"> <target class="NotifyFTP"> <ftp URL="ftp://ftp_user:ftp_pass@localhost:2121/data/recieve" filename="ftp01.txt" /> </target> </NotificationList> </property> </action> <action name="log" class="org.sample.soa.esb.actions.LogAction"> <property name="message" value="転送完了" /> </action> </actions> </service>
これは正確でない。
なぜなら、前述した通り順序的には
「転送完了」
というログが出力された後にFTP転送が実行されるので。
これは単なるログ出力なのでクリティカルな問題にはつながらないだろうけど、FTP転送完了後にまた別の対向システムへ「転送完了」を通知するような場合だと・・・ヤバいですよね。
ということで、気をつけるべし。