色々あって、最近JMSに興味を持って、ちょっとずつ見てまわってます。S2JMSもM1がリリースされたので、これも参考にソースを眺めてますが、概念が分かってないと難しいことがいっぱいですね。

 とりあえず、興味があるのは以下の様な項目なのですが、なにせMQとか一切使ったことないし、周りにも知っている人がいないので手探り状態です。

 ※手探りなので、以下に書いてあることは適当です。ツッコミ大歓迎!

トランザクション制御

 まずは、トランザクション制御。やりたいことは、プロデューサ→ブローカとブローカ→コンシューマのそれぞれがトランザクショナルに(DBなどの他のリソースと合わせて)制御したいなと。

 画面→非同期ロジックなどと呼び出す場合、画面側はUserTransaction.beginとしてやれば、J2EEコンテナのJTAが宜しくしてくれるのでしょうか。なんとなく、そんな気がしますが試さないとですね。

 気になっているのは非同期ロジック側で、色々見ているとMDBをCMTで使えば出来そうな雰囲気はつかめました。S2JMSでは、MDBを使わないでJTAに対応したJCAとしてS2JCAを用意して、対応しているのでしょうか。同期受信を使ってポーリングしているように見えました。

 MDBはデプロイが面倒なので、使わないで済むなら使いたくない気もしますが、その場合スレッドプールなどの同時処理を考慮した実装を自分でやらなくちゃいけなくなるのですよね。これは、ちょっと悩んでしまいます。

 WebLogicの場合、JMSコネクションをトランザクションに自動参加させることができるようですので、これを使ったらS2JMSでやっているようなことも出来そうな気がします。

非同期の戻り

 非同期で処理をすると時間の掛かる処理をユーザ画面から切り離すなど、昔Windowsプログラミングでマルチスレッドを使ってやっていたようなことが出来るのはいいのですが、終わったら教えて欲しい状況というのが、よくある気がします。

 これも、ちょっと考えただけでも複数のパターンが考えられそうです。ユーザ画面がポーリングするような感じで待っているパターンと、ユーザ処理は一度終わって後でメールなどの手段でユーザに伝えるようなパターン。前者がシンプルに解決できればいいのですが、今一つイメージが沸きません。

メッセージのサイズ

 メッセージという単位でやり取りをするというのは、パラメータと戻り値というRPC的な考え方からレコード単位でやり取りするという考え方に変わるようなイメージがあります。ここで疑問なのは、メッセージってどれくらい大きなものまで扱うものなのかなと言うこと。

 例えば、極端な例ですが10万件のデータ抽出処理、時間が掛かるので非同期に切り出すとして恐らく結果は一時ファイルに出力してファイル名をメッセージとしてやり取りする形に作ると思います。ここまで大きいときは、きっとメッセージには含めないだろうなと思うのですが、じゃあどれくらいまでなら含めるんだろう?と。一般論的なものが知りたいところです。

複数の用途に同時に使う場合

 非同期処理が複数あった場合、どの単位で複数使い分けるのか。例えばTopic/Queueを複数作って切り替えるか、それともメッセージの中に種別を含めて切り替えるのか。ミドルウェアの限界にもよる気がしますが、素直に考えるとTopic/Queueを使い分ける実装かなぁ。その場合、MDBは1つのTopic/Queueとしか関連づけられないようなので、複数作らなくちゃいけないのかな。


 とまぁ、やったこと無いだけに分からないこと、気になることだらけです。JMSも直接使うのか、S2JMSのようなものを通して使うのか(ただ、うちはJava 1.4だから使えないのですがw)、Webサービスのトランスポートとして使うのか、ESBのトランスポートとして使うのか。

 もう少し色々調べて、自前で実装するのか、なんか使うのか検討してみないと。受信部分だけでもJava 5に出来ればS2JMSも視野に入れられるのかな?