第15章 Apache ActiveMQ との統合

概要

Apache ActiveMQ を JMS プロバイダーとして使用する場合、宛先の JNDI 名を、キューまたはトピックの JNDI バインディングを動的に作成する特別な形式で指定できます。つまり、キューまたはトピックの JNDI バインディングを使用して事前に JMS プロバイダーを設定する必要はありません

The initial context factory

Apache ActiveMQ と JNDI を統合するキーは、ActiveMQInitialContextFactory クラスです。このクラスは、JNDI InitialContext インスタンスを作成するために使用され、JMS ブローカーの JMS 宛先にアクセスするために使用できます。

例15.1「Apache ActiveMQ に接続するための SOAP/JMS WSDL」 は、Apache ActiveMQ と統合された JNDI InitialContext を作成する SOAP/JMS WSDL 拡張を示しています。

例15.1 Apache ActiveMQ に接続するための SOAP/JMS WSDL

<soapjms:jndiInitialContextFactory>
  org.apache.activemq.jndi.ActiveMQInitialContextFactory
</soapjms:jndiInitialContextFactory>
<soapjms:jndiURL>tcp://localhost:61616</soapjms:jndiURL>

例15.1「Apache ActiveMQ に接続するための SOAP/JMS WSDL」 では、Apache ActiveMQ クライアントは tcp://localhost:61616 にあるブローカーポートに接続します。

接続ファクトリーの検索

JNDI InitialContext インスタンスの作成に加え、javax.jms.ConnectionFactory インスタンスにバインドされる JNDI 名を指定する必要があります。Apache ActiveMQ の場合、InitialContext インスタンスには 事前定義されたバインディングがあり、JNDI 名 ConnectionFactoryActiveMQConnectionFactory インスタンスにマッピングします。例15.2「Apache ActiveMQ 接続ファクトリーを指定する SOAP/JMS WSDL」 ApacheActiveMQ 接続ファクトリーを指定するための SOAP/JMS 拡張要素を示します。

例15.2 Apache ActiveMQ 接続ファクトリーを指定する SOAP/JMS WSDL

<soapjms:jndiConnectionFactoryName>
  ConnectionFactory
</soapjms:jndiConnectionFactoryName>

動的宛先の構文

キューまたはトピックに動的にアクセスするには、宛先の JNDI 名を次のいずれかの形式の JNDI 複合名として指定します。

dynamicQueues/QueueName
dynamicTopics/TopicName

QueueName および TopicName は Apache ActiveMQ ブローカーが使用する名前です。JNDI 名は抽象化され ません

例15.3「動的作成されたキューを含む WSDL ポート仕様」 は、動的に作成されたキューを使用する WSDL ポートを示しています。

例15.3 動的作成されたキューを含む WSDL ポート仕様

<service name="JMSService">
  <port binding="tns:GreeterBinding" name="JMSPort">
    <jms:address jndiConnectionFactoryName="ConnectionFactory"
                 jndiDestinationName="dynamicQueues/greeter.request.queue" >
      <jms:JMSNamingProperty name="java.naming.factory.initial"
                             value="org.activemq.jndi.ActiveMQInitialContextFactory" />
      <jms:JMSNamingProperty name="java.naming.provider.url"
                             value="tcp://localhost:61616" />
    </jms:address>
  </port>
</service>

アプリケーションが JMS 接続を開くと、Apache ActiveMQ は JNDI 名 greeter.request.queue を持つキューが存在するかどうかを確認します。存在しない場合は、新しいキューが作成され、JNDI name greeter.request.queue にバインドします。