web-dev-qa-db-ja.com

IBM MQを使用したApache Camel

こんにちは、IBMのMQでCamelを使用したことのある人がいます。 2つの製品を一緒に使用することを検討していますが、2つの製品が一緒に動作する例はありません。

9
Nitin

私が得ることができた最高のものは以下に文書化されており、CAMELコンテキストとルートをホストするSpring XMLアプリケーションコンテキストとして示されています。このサンプルは、IBMネイティブMQ JCA準拠のリソースアダプターv7.5、CAMEL 2.16、Spring core 4.2で動作します。 Glassfish、Weblogic、JBoss EAP7サーバーにデプロイしました。

複雑さは、哲学がプレーンなJMS返信メッセージの哲学と矛盾するMQレポートのフローの処理に限定されています。詳細な説明については、 Camel JMSコンポーネントを介したCoDによるネイティブwebsphere MQの実装 を参照してください。

CAMEL XML DSLに基づくこの例は、自己完結型であり、テストが簡単です。

Spring&CAMEL宣言から始めます。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:camel="http://camel.Apache.org/schema/spring"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
    http://camel.Apache.org/schema/spring http://camel.Apache.org/schema/spring/camel-spring.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

CAMELコンテキストは、MQからJMSおよびJMSからMQの2つのルートで続きます。ここでは、テストを容易にするためにブリッジを形成するためにチェーンされています。

<camel:camelContext id="mqBridgeCtxt">
<camel:route id="mq2jms" autoStartup="true">

奇妙なこと:Weblogicでは、(たとえば)3つのリスナーを取得する唯一の方法は、それぞれ最大1セッションで3つの接続(3つのCamel:fromステートメント)を強制することです。それ以外の場合、MQエラーが発生します:MQJCA1018:接続ごとに1つのセッションのみ許可されています。 JBossでは、concurrentConsumers = ...を調整するだけです。

  <camel:from uri="wmq:queue:TEST.Q1?concurrentConsumers=1&amp;disableReplyTo=true&amp;
        acknowledgementModeName=SESSION_TRANSACTED"/> 

上のdisable disableReplyToオプションは、MQメッセージタイプを1 = Request(-reply)または8 = datagram(一方向!)にテストする前に、CAMELが応答を生成しないようにします。このテストと応答の構成はここでは示していません。

次に、プレーンJMSへの次のポストでEIPをInOnlyに強制して、インバウンドMQモードと整合性を保ちます。

  <camel:setExchangePattern pattern="InOnly"/>
  <!-- camel:process ref="reference to your MQ message processing bean fits here" / -->
  <camel:to uri="ref:innerQueue" />
</camel:route>

これにより、MQ-to-jmsルートが終了します。次に、同じCAMELコンテキスト内のjms-to-MQルートが続きます。

<camel:route id="jms2mq"  autoStartup="true">
  <camel:from uri="ref:innerQueue" />
  <!-- remove inner message headers and properties to test without inbound side effects! -->
  <camel:removeHeaders pattern="*"/> 
  <camel:removeProperties pattern="*" />
  <!-- camel:process ref="reference to your MQ message preparation bean fits here" / -->

MQ CoDレポートの要求フラグがリモート宛先から返されるようになりました。また、MQメッセージをデータグラムタイプ(値8)に強制します。

  <camel:setHeader headerName="JMS_IBM_Report_COD"><camel:simple resultType="Java.lang.Integer">2048</camel:simple></camel:setHeader>
  <camel:setHeader headerName="JMS_IBM_Report_Pass_Correl_ID"><camel:simple resultType="Java.lang.Integer">64</camel:simple></camel:setHeader>
  <camel:setHeader headerName="JMS_IBM_MsgType"><camel:simple resultType="Java.lang.Integer">8</camel:simple></camel:setHeader>

ReplyToキューは、ReplyTo uriオプションを介して、または以下のようにヘッダーとして指定できます。

次に、CamelJmsDestinationNameヘッダーを使用して、JMS MQメッセージヘッダーMQRFH2の抑制を強制します(targetClient MQ URLオプション値1を使用)。つまり、プレーンなVanilla MQバイナリメッセージを送信する必要があります(つまり、ペイロードが後に続くMQMDメッセージ記述子のみ)。

  <camel:setHeader headerName="JMSReplyTo"><camel:constant>TEST.REPLYTOQ</camel:constant></camel:setHeader>
  <camel:setHeader headerName="CamelJmsDestinationName"> <camel:constant>queue://MYQMGR/TEST.Q2?targetClient=1</camel:constant></camel:setHeader>

以下に示すように、予約されたJMSプロパティを通じて、より多くのMQMDフィールドを制御できます。 IBMドキュメントの制限を参照してください。

  <camel:setHeader headerName="JMS_IBM_Format"><camel:constant>MQSTR   </camel:constant></camel:setHeader>
  <camel:setHeader headerName="JMSCorrelationID"><camel:constant>_PLACEHOLDER_24_CHARS_ID_</camel:constant></camel:setHeader>

URIの宛先キューは上記のCamelJmsDestinationNameによって上書きされるため、URIのキュー名はプレースホルダーになります。

URIオプションpreserveMessageQosは-観察されたように-(MQ CoDレポートを取得するために)ReplyToデータが設定されたメッセージを送信できるが、CAMELがInOnly MEPを強制することによってReplyメッセージリスナーをインスタンス化できないようにします。

  <camel:to uri="wmq:queue:PLACEHOLDER.Q.NAME?concurrentConsumers=1&amp;
            exchangePattern=InOnly&amp;preserveMessageQos=true&amp;
            includeSentJMSMessageID=true" />
</camel:route>
</camel:camelContext>

まだ完了していません。ネイティブJMSプロバイダーとWebsphere MQの両方のキューファクトリを(ネイティブIBM WMQ JCAリソースアダプターを介して)宣言し、コンテキストに合わせて調整する必要があります。ここでは、管理オブジェクトでJNDI検索を使用します。

<camel:endpoint id="innerQueue" uri="jmsloc:queue:transitQueue">
</camel:endpoint>

<jee:jndi-lookup id="mqQCFBean" jndi-name="jms/MYQMGR_QCF"/>
<jee:jndi-lookup id="jmsraQCFBean" jndi-name="jms/jmsra_QCF"/>

<bean id="jmsloc" class="org.Apache.camel.component.jms.JmsComponent">
  <property name="connectionFactory" ref="jmsraQCFBean" />
</bean>

<bean id="wmq" class="org.Apache.camel.component.jms.JmsComponent">
  <property name="connectionFactory" ref="mqQCFBean" />
</bean>

</beans>

JNDIからファクトリー(およびJCAアダプター)をフェッチする代わりに、JMSクライアントをSpring Beanとして宣言することもできます。 WeblogicとGlassfishでは、ネイティブIBM JCAリソースアダプターをデプロイし、JNDIリソースを作成して上記のようにSpringコンテキストで参照します。JBossでは、以下のように直接MQクライアントBean宣言が最適です)

<bean id="mqCFBean" class="com.ibm.mq.jms.MQXAConnectionFactory">
    <property name="hostName" value="${mqHost}"/>
    <property name="port" value="${mqPort}"/>
    <property name="queueManager" value="${mqQueueManager}"/>
    <property name="channel" value="${mqChannel}"/>
    <property name="transportType" value="1"/> <!-- This parameter is fixed and compulsory to work with pure MQI Java libraries -->
    <property name="appName" value="${connectionName}"/>
</bean>

<bean id="wmq" class="org.Apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="mqCFBean"/>
    <property name="transacted" value="true"/>
    <property name="acknowledgementModeName" value="AUTO_ACKNOWLEDGE"/>
</bean>

コメントと改善を歓迎します。

3
berhauz

ラクダでIBM MQを幅広く使用しています。両方を併用しても問題はありません。ラクダのJmsエンドポイント、Spring接続ファクトリ、およびIBM MQ定義を利用して、Springコンテキストファイルの1つからサンプル構成を貼り付けます。

キャメルルート

from("someplace")
    .to("cpaibmmq:queue:myQueueName");

春のコンテキスト

<bean name="cpaibmmq" class="org.Apache.camel.component.jms.JmsComponent" destroy-method="doStop">
    <property name="transacted" value="${jms.transacted}" />
    <property name="concurrentConsumers" value="${cpa.concurrentConsumers}" />
    <property name="maxConcurrentConsumers" value="${cpa.concurrentConsumers}" />
    <property name="acceptMessagesWhileStopping" value="${jms.acceptMessagesWhileStopping}" />
    <property name="acknowledgementModeName" value="${jms.acknowledgementModeName}" />
    <property name="cacheLevelName" value="${jms.cacheLevelName}" />
    <property name="connectionFactory" ref="ibmFac1" />
    <property name="exceptionListener" ref="ibmFac1" />
</bean>

<bean id="ibmFac1" class="org.springframework.jms.connection.SingleConnectionFactory" destroy-method="destroy">
    <constructor-arg>
        <bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="transportType" value="1" />
            <property name="channel" value="${cpa.wmq.channel}" />
            <property name="hostName" value="${cpa.wmq.hostname}" />
            <property name="port" value="${cpa.wmq.port}" />
            <property name="queueManager" value="${cpa.wmq.mqmanager}" />
        </bean>
    </constructor-arg>
</bean>
8
Matthew Fontana

簡単なグーグルは以下を明らかにしました、
http://lowry-techie.blogspot.de/2010/11/camel-integration-with-websphere-mq.html

HTH

1
nabsha