S2JMS開発記 - できたと思ったら・・・

ダメでした。

受信したMessageをJMSRequestに登録しただけで満足してしまっていました。
MessageListener(POJO)にバインドしてあげなきゃ意味がなかったのでした。

さてどうしたものか。

JMSContainerとしては、JMSRequestに持っているオブジェクト(メッセージも含めて)をMessageListener(POJO)呼び出し前にバインドしてあげる必要があります。

S2JSF でアクションを呼び出す前にリクエストスコープにあるオブジェクトをインジェクションするのと同じですね。

案1 MessageListener(POJO)をリクエストスコープでDiconに登録してもらうようにする。

これは、S2JSFのactionと同じような位置づけ。

JMSRequestに入っているオブジェクトは一度コンテナにRequest(またはPrototype)属性で放りこんでおき、メッセージ受信のたびにコンテナからMessageListenerを取得する。

  • メリット
    • 実装が比較的簡単(バインドはS2Containerで面倒を見てくれるから)
  • デメリット
    • メッセージ受信のたびにMessageListenerのインスタンスが生成されるので、パフォーマンス的に心配

案2 S2Containerに頼らず、独自でインジェクションする

  • メリット
    • MessageListener(POJO)の属性に依存しない。
  • デメリット
    • バインドの仕方が少し面倒
    • →@JMSPayloadなどのアノテーションがついていないプロパティに対して、JMSRequestに入っているオブジェクトをインジェクションする?
    • →それとも、@JMSRequestのように明示的にアノテートされたプロパティに対してインジェクションする?

以下のように、@JMSRequest アノテーションをつけたプロパティ/フィールドに対してインジェクションするのが一番良さそうに思いますが、id:koichik さん、どう思います?

@JMSRequest
Message message;