4

私のテストでは、inmem ActiveMQ を実行し、次に ActiveMQConnectionFactory をインスタンス化し、テストするために必要なことを行います。統合テストを作成する最も簡単な方法と思われるため、これを使用しました。ActiveMQConnectionFactory から com.ibm.mq.jms.MQTopicConnectionFactory への切り替えは簡単だと思いました。しかし、そうではないようです。このスニペットからのマッピングはどうなるでしょうか

<bean id="activeMqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <constructor-arg value="vm://localhost:61616"/>
</bean>

その人に:

<bean id="ibmConnectionFactory" class="com.ibm.mq.jms.MQTopicConnectionFactory">
    <property name="hostName" value="??"/>
    <property name="port" value="??"/>
    <property name="queueManager" value="??"/>
    <property name="channel" value="??"/>
    <property name="transportType" value="?"/>
</bean>

キャメルが持っているある種の奇妙な橋がなくても、それは可能でしょうか?

4

2 に答える 2

4

これは不可能です。JMS 仕様は API と動作をカバーしていますが、ベンダーは希望するワイヤ形式と通信プロトコルを自由に実装できます。WebSphere MQ は独自の形式とプロトコルを使用し、Active MQ は独自の形式とプロトコルを使用します。

ブリッジ アプリケーションは、メッセージを 1 つのトランスポートからメモリに読み取り、そのメッセージを別のトランスポートに書き込むことによって機能します。これは基本的なレベルで機能しますが、2 つのトランスポートには異なる宛先名前空間とセキュリティ レルムがあるため、これらのインターフェイスはハードコーディングされたポイントツーポイント ルートになる傾向があります。これは通常、JMS トランスポート プロバイダーを混在させる場合に期待できる最善の方法です。

于 2012-08-17T12:56:21.133 に答える
4

IBM jms クラス (例: com.ibm.mq.jms.MQTopicConnectionFactory ) を使用している場合、接続先の WebSphere MQ ブローカーが必要なため、Camel または ActiveMQ JMS ブリッジのいずれでも、これを行うことはできません。

しかし、私はあなたが 1 つのプロジェクトでやろうとしていることを正確に実行しました。コアとなる考え方は、ベンダー固有のクラスを使用するのではなく、コード内の JMS インターフェースを使用することです。次に、設定を JNDI に保存できます (1 つは統合テスト用、もう 1 つは本番/受け入れテスト用)。

JNDI を使用したくない場合は、シナリオごとに異なるスプリング コンテキストを使用できます (それが私のアプローチでした)。

簡単な例を見てみましょう:

2 つの別々の applicationContext.xml ファイル (1 つの埋め込みテストと 1 つのプロダクション)

int テスト:

<beans>
  <import resource="jmsTest.xml"/>
  <import resource="mainApplication.xml"/>
</beans>

製品:

<beans>
  <import resource="jmsProd.xml"/>
  <import resource="mainApplication.xml"/>
</beans>

次に、jms コンテキストを作成します。

jmsTest.xml:

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <constructor-arg value="vm://localhost:61616"/>
</bean>

jmsProd.xml

<bean id="connectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
  <property name="hostName" value=".."/>
   ... 
</bean>

mainApplication.xml (jms リスナーなど)、同じ

<bean id="myJmsHandlingClass" class="some.custom.Class"/>
  <property name="connectionFactory" ref="connectionFactory"/>
</bean>

WMQ と AMQ の両方に jms 標準の拡張機能があり、使いたくなる可能性があるため、JMS 仕様に必ず従ってください。ベンダー固有のことは何もしません。

トピックを扱っている場合に注意が必要な点の 1 つは、AMQ と WMQ がデフォルトで異なるトピック セパレータを使用することです。

WMQ の場合: root/subtopic/#

AMQ の場合: root.subtopic.*

したがって、Spring を介して宛先を注入することもできます。これは、上記の接続ファクトリに似ています。

于 2012-08-19T09:20:45.840 に答える