S2JMS開発記 - 続・requestスコープの検討

先日からの検討のつづき。自分の理解の整理も含めて書いています。

受信したメッセージをリクエストスコープで登録できるようにするには、HttpServletRequestに突っ込まなくてはなりません。しかし、JMSの場合は必ずしもAPサーバ上で動作するとはかぎらない。そのため、当初はHttpServletRequestの独自実装するという話になっていました(http://d.hatena.ne.jp/koichik/20060103#1136296856 を参照)。

しかし、Seasar2.4からは、ServletAPI依存を無くすため、ExternalContextというインターフェースが登場します。

ExternalContextはこんな感じ。

public interface ExternalContext {
    Object getRequest();
    void setRequest(Object request);
    Object getResponse();
    void setResponse(Object response);
    Object getSession();
    Object getApplication();
    void setApplication(Object application);
}

基本的には、この実装クラス(JMSExternalContext)と、HttpServletRequestに代わるリクエスト(JMSRequestとか)を用意して、そこにJMSメッセージを突っ込めば良いはず・・・。

しかし、ここで問題発生。スコープがリクエストの場合、実際にコンポーネントを生成する org.seasar.framework.container.deployer.RequestComponentDeployer を見ると(実はこのあたりを調べたいがために、S2Containerのクラス図を書いてみたりしたのだ・・・)、実装が HttpServletRequest に依存していることが判明(前回と同一リクエストだったら同じインスタンスを返す・・・というあたりが)。

やはり、HttpServletRequest の独自実装をつくるべきなのか・・・?