Messenger

コンポーネント レポジトリ

Sandboxコンポーネント

日本語訳 (Translations)

オリジナル

Introduction

Messengerは、JMS (Java Message Service)フレームワークであり、 JMSをウェブサービスやウェブアプリケーション環境で簡単に使えるようにします。

Messangerは、JMSを容易に動かすセッションプーリング(JMSでそれを行うのはとても大変です)を実装しています。 また、Messengerは、 Messengerインターフェースを実装した シンプルなラッパーAPIによって、JMSの複雑さの多くが隠蔽されます。

加えて、Messengerは、アプリケーションのコード内で、複雑なデプロイ設定詳細を乱雑にさせない為に、 XMLでのデプロイ設定ファイルを備えています。

Messengerは、また、MessageListeners・メッセージ稼動型オブジェクト・サーブレット・JSPを通じて JMSメッセージを処理するサーブレットエンジンにデプロイされる、 JMSベースのコンテナであるMessagelet Engineを備えています。


Example Config

ここで、デプロイ用設定ファイルMessenger.xmlの例をお見せします。

<?xml version="1.0" encoding="UTF-8"?>
<manager>

  <!-- this example Messenger XML config file should work with J2EE SDK -->

  <messenger name="topic">
    <jndi lookupName="TopicConnectionFactory">
      <property>
        <name>com.sun.jms.internal.java.naming.factory.initial</name>
        <value>com.sun.enterprise.naming.SerialInitContextFactory</value>
      </property>          
    </jndi>
  </messenger>

  <messenger name="queue">
    <jndi lookupName="QueueConnectionFactory">
      <property>
        <name>com.sun.jms.internal.java.naming.factory.initial</name>
        <value>com.sun.enterprise.naming.SerialInitContextFactory</value>
      </property>          
    </jndi>
  </messenger>

</manager>

topicqueueと呼ばれる標準の2つのMessengersを各々生成するため、J2EE SDKで動かすべきです。

では、どのように、Javaコードからこれら2つのMessangersを使うのでしょうか?


Example Code

ここでは、"topic"内にメッセージを送るサンプルコードをご紹介します。


// get a Messenger and Destination
Messenger messenger = MessengerManager.get( "topic" );
Destination destination = messenger.getDestination( "CHAT.NEWBIES" );

// now lets send a message
TextMessage message = messenger.createTextMessage( "this is some text" );
messenger.send( destination, message );

ここでは、"queue"内のメッセージを受け取る(メッセージが到達するまでは拒否)サンプルコードをご紹介します。


// get a Messenger and Destination
Messenger messenger = MessengerManager.get( "queue" );
Destination destination = messenger.getDestination( "REQUEST.BUILD" );

// now lets receive a message
Message message = messenger.receive( destination );

log4jといったツールと 同じ方法でMessengerManagerの裏に個々のMessengerオブジェクトのコンストラクタ がどのように隠蔽され得るのか、と言った事に注意して下さい。

また、Messenger APIがシンプルなfacadeであり、MessageConsumer・MessageProducer・TopicPublisher・ TopicSubscriber・QueueSender・QueueReceiver・多くのコネクションやセッションオブジェクトの使用が必要ないのと同様、 TopicやQueue用の特別なコーディングが必要ない、という事も押さえておいて下さい。


Configuration

デフォルトでは、Messengerは、以下のようなコードでMessengerインスタンスを調べてすぐに、 CLASSPATH上のMessenger.xmlと呼ばれるXMLドキュメントを探します。


Messenger messenger = MessengerManager.get( "customer.orders" );

代わりのアプローチとしては、 システムプロパティとして org.apache.commons.messengerを定義し、 Messengerデプロイ用設定ファイルのURLを指し示します。例えば:


  $ java -Dorg.apache.commons.messenger=http://localhost/config/Messenger.xml MyApplication

サーブレット環境下においては、サーブレット初期化パラメタを使ったサーブレット初期化メソッドで、 はっきりとMessengerManagerの設定を行う、というのは、良い考え方でしょう。 以下、例を挙げると:


public class MyServlet extends HttpServlet {
    
    public void init() throws ServletException {
        // initialise the Messenger connections
        String url = getInitParameter( "messenger" );
        if ( url != null ) {
            MessengerManager.configure( url );
        }
    }
}  


Messagelets

Messengerプロジェクトは、Tomcat4.0といったサーブレットエンジンで動くJMSベースのコンテナである Messageletエンジンを提供します。 Messageletエンジンは、 一定のJMS MessageListners・Message稼動型オブジェクト・サーブレット・JSPを使った様々な やり方の中で、JMSメッセージを処理するシンプルなフレームワークをMessageletエンジンは提供します。

Messageletコンテナをデプロイするために、ウェブアプリケーションにManagerServletを加え、 様々なJMS connectionsを全て記述したXMLの設定ファイルを加え、 subscriptionsを全て記述したXMLの設定ファイルを加えます。

connectionssubscriptions のXML設定ファイルの例です。 以下のセクションを、Messageletマネジャーサーブレットをデプロイするためのweb.xml設定ファイルに加える 必要があります。


  <servlet>
    <servlet-name>managerServlet</servlet-name>
    <servlet-class>org.apache.commons.messagelet.ManagerServlet</servlet-class>
    <init-param>
      <param-name>connections</param-name>
      <param-value>/WEB-INF/Messenger.xml</param-value>
    </init-param> 
    <init-param>
      <param-name>subscriptions</param-name>
      <param-value>/WEB-INF/subscriptions.xml</param-value>
    </init-param> 
    <load-on-startup>1</load-on-startup> 
  </servlet>

一旦、上記の事を行ってしまって、ウェブアプリケーションが開始すれば、 Messageletエンジンは、様々なJMS subscriptionsをsubscribeし、次に JMSメッセージを様々なMessageListnerオブジェクトやサーブレットあるいはJSPページに 送ります。

リクエストに依存するJMSメッセージを処理するには様々な方法があります。

  • MessageListenerは、メッセージの標準的なJMSリスナーです。
  • A MessageDrivenObject is-a JMS MessageListener which has extra servlet-based lifecycle methods just like a Servlet. This allows an MDO to know when its being initialised and when its being destroryed and so do some resource management (such as creating or closing database connections etc). Also on initialisation the MDO gets access to the ServletContext so that it can read some initialization parameters from the web application or perform web-app level logging and so on.
  • A MessengerMDO is-a MessageDrivenObject but also provides a number of helper methods such as access to the Messenger to which its listening, so that responses can be sent back to the originator of the message, as well as access to the ServletContext and some logging helper methods.
  • A Servlet can be any GenericServlet or HttpServlet. If the JMS message that is being dispatched is a TextMessage then the body of the message is available via the ServletRequest.getReader() method, in the normal Servlet way. Any output written to the ServletResponse.getWriter() will be converted into a TextMessage and sent back to the originator. All servlets and JSP pages have access to the originating JMS message and Messenger objects via the "message" and "messenger" request attributes respectively.
  • A Messagelet is a JMS specific Servlet, just like a HttpServlet is a HTTP specific Servlet. It provides access to a Messagelet specific MessageletRequest and MessageletResponse to allow access to the JMS Message and the Messenger for sending replies.
  • A JSP page can be any piece of JSP, for example the standard JSP tag library can be used to perform JavaScript, XPath, XSLT or SQL operations on the incoming message. The request scope "message" and "messenger" attributes can be used to access the originating JMS Message and Messenger objects.

MDO・サーブレット・Messageletのサンプルが、 こちらにあります。また、 JSPサンプルは こちらにあります。


Bridging JMS providers

加えて、Messageletエンジンは、Bridgeメカニズムを備えています。 Bridgeメカニズムは、メッセージを ある到達先/コネクションポイントで使わせ、もしかすると異なるJMSコネクション/JMSプロバイダを使って、 別の到達先に送らせることが出来ます。 これにより、例えば、メッセージがSpritWaveで使われ、もしかすると途中で独自の変換を適用しながら、 MQSeriesに送られる、というような事も出来るようになります。

Bridgeメカニズムは、BridgeMDOを通じて 提供されており、サブスクリプション・デプロイ・デスクリプター内で<bridge>タグ要素を使っています。



Tetsuya Kitahata
Translated into Japanese by Tetsuya Kitahata , powered by Terra-International, Inc.
Original English Page would be found from HERE     --    ApacheNews    ASF 繝励Ο繧ク繧ァ繧ッ繝井ク隕ァ
Terra-International, Inc. -- 繝繝ゥス・繧、繝ウ繧ソ繝シ繝翫す繝ァ繝翫Ν