第6章 JMS の使用

HornetQ は JMS 不明メッセージング API を提供しますが、多くのユーザーは JMS をより快適に使用できます。
JMS は非常に人気があるメッセージング用の API 標準であり、ほとんどのメッセージングシステムは JMS API を提供します。
この項では、JMS に対してサーバーを設定し、単純な JMS プログラムを作成する主な手順について説明します。また、JNDI を設定および使用する方法と JNDI を使用せずに HornetQ で JMS を使用する方法についても説明します。

6.1. 単純な注文システム - 設定例

この設定例では、OrderQueue という名前の JMS キューが、そのキューに注文メッセージを送信する単一の MessageProducer とともに使用されます。単一の MessageConsumer は、キューからの注文メッセージを消費します。
このキューは durable に設定されます (サーバーの再起動後やクラッシュ後も保持されます)。
また、この例では、クライアントからキューを明示的に作成せずにキューが自動的に作成されるよう、サーバー JMS 設定でキューを指定する方法についても説明します。

6.1.1. JMS サーバー設定

サーバークラスパスのファイル hornetq-jms.xml (標準設定 JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-jms.xml 内) には、作成し、JNDI を介してルックアップできる JMS キュー、トピック、および ConnectionFactory インスタンスが含まれます。
JMS ConnectionFactory オブジェクトは、サーバーに対する接続を確立するためにクライアントによって使用されます。このオブジェクトは、接続するサーバーの場所と他の多くの設定パラメーターを認識します。ほとんどの場合は、デフォルト値を使用できます。
この例では、サーバーに単一の JMS キューと単一の JMS 接続ファクトリーインスタンスがデプロイされますが、ファイルからデプロイできるキュー、トピック、および ConnectionFactory インスタンスの数に制限はありません。
<configuration xmlns="urn:hornetq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hornetq ../schemas/hornetq-jms.xsd ">
   <connection-factory name="NettyConnectionFactory">
      <connectors>
         <connector-ref connector-name="netty"/>
      </connectors>
      <entries>
         <entry name="/ConnectionFactory"/>           
      </entries>
   </connection-factory>
   <queue name="OrderQueue">
      <entry name="queues/OrderQueue"/>
   </queue>
</configuration>
ConnectionFactory という名前の接続ファクトリーがデプロイされ、entry 要素で提供されたように JNDI の 1 つの場所でバインドされます。ConnectionFactory インスタンスは JNDI の多くの場所でバインドできます (必要な場合)。

注記

JMS 接続ファクトリーは、netty という名前の connector を参照します。これは、サーバーに実際に接続するために使用されるトランスポートとパラメーターを定義する主要なコア設定ファイル JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-configuration.xml でデプロイされた connector オブジェクトの参照です。

6.1.2. 接続ファクトリータイプ

JMS API doc は、アプリケーション用の複数の接続ファクトリーを提供します。HornetQ JMS ユーザーは、これらの接続ファクトリーに対してタイプを設定するよう選択できます。各接続ファクトリーは signature 属性と xa パラメーターを持ち、これらの組み合わせによってファクトリーのタイプが決定されます。
属性 signature は 3 つの文字列値 (genericqueue、および topic) を持ちます。
xa はブール値タイプのパラメーターです。以下の表は、さまざまな接続ファクトリーインターフェースに対する設定値を示しています。

表6.1 接続ファクトリータイプの設定

signature xa 接続ファクトリータイプ
generic (デフォルト値) false (デフォルト値) javax.jms.ConnectionFactory
generic true javax.jms.XAConnectionFactory
queue false javax.jms.QueueConnectionFactory
queue true javax.jms.XAQueueConnectionFactory
topic false javax.jms.TopicConnectionFactory
topic true javax.jms.XATopicConnectionFactory
以下の例では、XAQueueConnectionFactory が設定されます。
<configuration xmlns="urn:hornetq" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:hornetq ../schemas/hornetq-jms.xsd ">
    
    <connection-factory name="ConnectionFactory" signature="queue">
        <xa>true</xa>
        <connectors>
           <connector-ref connector-name="netty"/>
        </connectors>
        <entries>
            <entry name="/ConnectionFactory"/>           
        </entries>
    </connection-factory>
</configuration>

6.1.3. コード

この例のコードは以下で利用可能です。
最初の手順では JMS オブジェクトをルックアップする JNDI 初期コンテキストを作成します。
InitialContect ic = new InitialContext();
次の手順では、接続ファクトリーをルックアップします。
ConnectionFactory cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
次に、キューをルックアップします。
Queue orderQueue = (Queue)ic.lookup("/queues/OrderQueue");
次に、接続ファクトリーを使用して JMS 接続を作成します。
Connection connection = cf.createConnection();
AUTO_ACKNOWLEDGE 承認モードで非トランザクション JMS セッションを作成します。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
キューに注文を送信する MessageProducer を作成します。
MessageProducer producer = session.createProducer(orderQueue);
キューから注文を消費する MessageConsumer を作成します。
MessageConsumer consumer = session.createConsumer(orderQueue);
接続を開始するようにしてください。開始しないと、配信が実行されません。
connection.start();
単純な TextMessage を作成し、送信します。
TextMessage message = session.createTextMessage("This is an order");
producer.send(message);
メッセージを消費します。
TextMessage receivedMessage = (TextMessage)consumer.receive();
System.out.println("Got order: " + receivedMessage.getText());

警告

JMS 接続、セッション、プロデューサー、およびコンシューマーが再使用されるよう設計されます
生成または消費する各メッセージに対して新しい接続、セッション、プロデューサー、およびコンシューマーを作成することは不適切です。これを行うと、アプリケーションのパフォーマンスが大幅に低下します。この詳細については、43章パフォーマンスチューニング を参照してください。