2016-03-29 14 views
7

背景: Websphere MQをメッセージングに使用する比較的古いアプリケーションがあります。 WAS(Websphere Application Server)上で動作し、MDB(Message Driven Bean)を使用します。 Spring Integration - JMSを使用してすべてのMDBを正常に置き換えることができました。私の次のステップは、IBM以外のJREを使って他のサーブレットコンテナ上で実行できるように、WASからポートすることができるかどうかを調べることです(私は試しています:apache tomcat)。 SSLを使用してチャネルを保護することが必要であることに注意してください。私はJNDIを使うほうが好きです。JMS用のSpring構成(Websphere MQ - SSL、Tomcat、JNDI、非IBM JRE)

最終的な目標: 私のアプリケーションをアプリケーションサーバー(WAS)とメッセージング(MQ)などの他のインフラストラクチャから切り離すため。しかし、これをWASのtomcatに取り込むことは、最初のステップです。次に、メッセージングインフラストラクチャを拡張性のあるものに更新する作業が行われます。これにより、私のアプリケーションが頼りにするインフラストラクチャの個々のコンポーネント(アプリケーションサーバー、メッセージングレイヤ、データストア)を一度に1つずつ更新することができます。

質問: 私の挑戦は、Websphere MQにアクセスできるTomcatでJNDIリソースを定義することです。私の次のステップは、これはSSLチャネルで動作するように取得することです

<Resource 
    name="jms/qcf_sandbox" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueueConnectionFactory" 
    factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory" 
    description="JMS Queue Connection Factory for sending messages" 
    HOST="localhost" 
    PORT="1414" 
    CHAN="CHANNEL_SANDBOX" 
    TRAN="1" 
    QMGR="QM_SANDBOX"/> 
<Resource 
    name="jms/SandboxQ" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueue" 
    factory="com.ibm.mq.jms.MQQueueFactory" 
    description="JMS Queue" 
    QU="SANDBOX_Q"/> 

:私はそうのようなcontext.xmlファイルで定義され、この使用して、非SSLチャネル上のいくつかの進歩を遂げています。私はキーストア(kdbファイルと証明書の生成と交換)の設定、QMなどのSSLチャネルの設定を含む部分を理解しています。どのように私はキーストア、暗号スイートなどを使用するようにTomcatを取得するのですか?ポインタや実際の例が素晴らしいでしょう!

注:現在Spring Integration 4.2、Websphere MQ v8、Tomcat v9を使用しています。

JNDIを使用せずにすべてを試したことを追加する必要があります。そこでここで働くJNDIのない私の春のJMS非SSL設定は、です:

<bean id="mq-jms-cf-sandbox" 
    class="org.springframework.jms.connection.SingleConnectionFactory"> 
    <property name="targetConnectionFactory"> 
    <ref bean="mqQueueConnectionFactory" /> 
    </property> 
</bean> 
<bean id="mqQueueConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
    <property name="hostName" value="localhost" /> 
    <property name="port" value="1414" /> 
    <property name="queueManager" value="QM_SANDBOX" /> 
    <property name="transportType" value="1" /> 
    <property name="channel" value="CHANNEL_SANDBOX" /> 
</bean> 
<bean id="jms-destination-sandbox" class="com.ibm.mq.jms.MQQueue"> 
    <constructor-arg value="SANDBOX_Q" /> 
    <property name="baseQueueManagerName"> 
    <value>QM_SANDBOX</value> 
    </property> 
    <property name="baseQueueName"> 
    <value>SANDBOX_Q</value> 
    </property> 
</bean> 

答えて

9

私は私が最終的にこれをやってのけるする方法を考え出したと思います...ここのステップの簡単な説明です。詳細が必要な場合は、私に知らせてください。

プリREQS: のWebsphere MQサーバーインストール(少なくともV 8.0.0.2) 設定QM、SSLと非SSLのチャンネル、Qsを、あなたが必要なすべてのもの良いものを作成します。 言うまでもなく、Websphere MQ jarが必要です。ライセンスの制限に注意してください。

ステップ1:SSLなしで動作する直接接続を取得します.JNDIはありません。あなたは、など

<bean id="mq-jms-cf-sandbox" 
    class="org.springframework.jms.connection.SingleConnectionFactory"> 
    <property name="targetConnectionFactory"> 
    <ref bean="mqQueueConnectionFactory" /> 
    </property> 
</bean> 
<bean id="mqQueueConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
    <property name="hostName" value="localhost" /> 
    <property name="port" value="1414" /> 
    <property name="queueManager" value="QM_SANDBOX" /> 
    <property name="transportType" value="1" /> 
    <property name="channel" value="NON_SSL_CHANNEL" /> 
</bean> 
<bean id="jms-destination-sandbox" class="com.ibm.mq.jms.MQQueue"> 
    <constructor-arg value="SANDBOX_Q" /> 
    <property name="baseQueueManagerName"> 
    <value>QM_SANDBOX</value> 
    </property> 
    <property name="baseQueueName"> 
    <value>SANDBOX_Q</value> 
    </property> 
</bean> 

ステップ2あなたの春ベースのJMSリスナーを設定するには、これらのBeanを使用する必要があるとJMSテンプレートます:SSLでの作業の直接接続、無JNDIを取得します。私はこれをやや微妙に設定することがわかった。

2a。これは明らかに、我々は、少なくとも私たちのWebsphereを持っている必要があることを意味 http://www-01.ibm.com/support/docview.wss?uid=swg1IV66840

:私は非IBM JREを使用していたので、私はここで指定されたマッピングに従って設定する必要が&暗号スイート暗号仕様を確認していましたMQは8.0.0.2にアップグレードされました。私の場合はそうのように、TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384を使用するアプリケーション内のJMS豆をSSLチャネルでECDHE_RSA_AES_256_GCM_SHA384を使用して構成された:

<bean id="mq-jms-cf-sandbox" 
    class="org.springframework.jms.connection.SingleConnectionFactory"> 
    <property name="targetConnectionFactory"> 
     <ref bean="mqQueueConnectionFactory" /> 
    </property> 
</bean> 
<bean id="mqQueueConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"> 
    <property name="hostName" value="localhost" /> 
    <property name="port" value="1414" /> 
    <property name="queueManager" value="QM_SANDBOX" /> 
    <property name="transportType" value="1" /> 
    <property name="channel" value="SSL_CHANNEL" /> 
    <property name="SSLCipherSuite" value="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"/> 
</bean> 
<bean id="jms-destination-sandbox" class="com.ibm.mq.jms.MQQueue"> 
<constructor-arg value="SANDBOX_Q" /> 
    <property name="baseQueueManagerName"> 
     <value>QM_SANDBOX</value> 
    </property> 
    <property name="baseQueueName"> 
     <value>SANDBOX_Q</value> 
    </property> 
</bean> 

図2bを。証明書、キーストア(kdbs)の作成、証明書の交換などこれには多くの方法があります。ただし、パスワードを隠す必要があることに注意してください。キュー・マネージャーのキー・ラベルは、 'ibmwebspheremq qmgr'でなければなりません。小文字で、スペース(引用符なし)で、キー・ラベルは 'ibmwebspheremq userid ' - すべて小文字で、スペースは含まれません(引用符なし)。ここで、useridはtomcatを実行するユーザーIDです。私が自己署名証明書を使って正確にどのようにしたかについての詳細が必要な場合は、教えてください。

2c。これで、Tomcatが実行するJVMを取得して、キーストアを読み取る必要があります。そこに多くの方法があるが、ここで私はそれをやった方法は次のとおりです。 以下の内容で、Tomcatのbinフォルダ内のsetenv.batファイルを作成します

set JAVA_OPTS="-Djavax.net.ssl.trustStore=C:\path-to-keystore\key.jks" "-Djavax.net.ssl.trustStorePassword=topsecret" "-Djavax.net.ssl.keyStore=C:\path-to-keystore\key.jks" "-Djavax.net.ssl.keyStorePassword=topsecret" "-Djavax.net.debug=ssl" "-Dcom.ibm.mq.cfg.useIBMCipherMappings=false" 

2D(SSLをデバッグすることはオプションです)。次のコマンドを使用してtomcatを起動してください:

catalina.bat run > ..\logs\tomcat.log 2>&1 

停止するには、Ctrl + C(ウィンドウ上)を押してください。いずれにしても、起動時にsetenv.batが使用されていることを確認してください。または、JAVA_OPTSを使用してキーストアのプロパティを設定します。

2e。 SSLチャネルを使用していることを確認します。

ステップ3:非SSLで動作するJNDI接続を取得します。JNDI TomcatにJNDIを設定する方法はたくさんあります。私はそれをやった方法をここにあります:Webアプリケーション内の次の内容のファイルMETA-INF/context.xmlにを作成します。あなたの春のconfigに今

<Resource 
    name="jms/qcf_sandbox" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueueConnectionFactory" 
    factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory" 
    description="JMS Queue Connection Factory for sending messages" 
    HOST="localhost" 
    PORT="1414" 
    CHAN="NON_SSL_CHANNEL" 
    TRAN="1" 
    QMGR="QM_SANDBOX"/> 
<Resource 
    name="jms/SandboxQ" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueue" 
    factory="com.ibm.mq.jms.MQQueueFactory" 
    description="JMS Queue" 
    QU="SANDBOX_Q"/> 

、代わりに直接構成で、あなたがしなければならないすべてはあります:

<jee:jndi-lookup id="mq-jms-cf-sandbox" jndi-name="java:/comp/env/jms/qcf_sandbox" resource-ref="false" /> 
<jee:jndi-lookup id="jms-destination-sandbox" jndi-name="java:/comp/env/jms/SandboxQ" resource-ref="false" /> 

私はちょうどリソース参照を使用していないことに注意してください。場合には、いくつかの追加ステップがあります。

ステップ4:最後に、SSLチャネルとJNDIを使用します。手順2を完了したと仮定すると、これは簡単です。

<Resource 
    name="jms/qcf_sandbox" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueueConnectionFactory" 
    factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory" 
    description="JMS Queue Connection Factory for sending messages" 
    HOST="localhost" 
    PORT="1414" 
    CHAN="SSL_CHANNEL" 
    TRAN="1" 
    QMGR="QM_SANDBOX" 
    SCPHS="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"/> 
<Resource 
    name="jms/SandboxQ" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueue" 
    factory="com.ibm.mq.jms.MQQueueFactory" 
    description="JMS Queue" 
    QU="SANDBOX_Q"/> 

注SCPHS = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" と行:以下の内容でMETA-INF/context.xmlにを変更します。他のパラメータを設定する必要がある場合は、このリンクの「短い形式」の列をご覧ください。 https://www.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.ref.dev.doc/q111800_.htm%23jm10910_?lang=en

このすべてがうまくいきます。がんばろう!

この設定が完了すると、メッセージの送信は簡単です。使用SpringのDefaultMessageListenerContainerので(春-beans.xmlの)のようなXMLファイルにあなたの豆を設定:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html

ステップ1:しかし、これはあなたが春のJMS リファレンスを使用して、キュー上のメッセージを聞くことができる方法です。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
    "http://www.springframework.org/dtd/spring-beans.dtd"> 

    <!-- this is the Message Driven POJO (MDP) --> 
    <bean id="messageListener" class="jmsexample.ExampleListener" /> 

    <!-- and this is the message listener container --> 
    <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="mq-jms-cf-sandbox"/> 
     <property name="destination" ref="jms-destination-sandbox"/> 
     <property name="messageListener" ref="messageListener" /> 
    </bean> 

</beans> 

ステップ2:あなたのweb.xmlにこれを追加

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/context/spring-beans.xml</param-value> 
</context-param> 

<listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

ステップ3:そうのようなメッセージリスナクラスを書く:詳細な説明に

<int:channel id="jms-inbound"/> 
    <int-jms:message-driven-channel-adapter 
     id="jms-inbound-adapter" container="jmsContainer" channel="jms-inbound" 
     extract-payload="true" acknowledge="transacted" 
     message-converter="messagingMessageConverter" /> 

<beans:bean id="messagingMessageConverter" class="org.springframework.jms.support.converter.MessagingMessageConverter"> 
    </beans:bean> 
+0

:あなたは春の統合を使用している場合

import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; public class ExampleListener implements MessageListener { public void onMessage(Message message) { if (message instanceof TextMessage) { try { System.out.println(((TextMessage) message).getText()); } catch (JMSException ex) { throw new RuntimeException(ex); } } else { throw new IllegalArgumentException("Message must be of type TextMessage"); } } } 

また、代わりにステップ3で、あなたはそのような何かを行うことができます+1。 –

+0

ステップ1を設定する場所は?ファイルの名前は、spring-beans.xmlや他のファイル内にあり、読み方はどのようになっていますか? – Chinmoy

+0

これはXMLファイルで、Spring Beanを構成します(複数のファイルにも分割できます)。あなたのweb.xmlの中でそれが言及されていることを確認してください(名前付け規則に基づいてデフォルトで選択できない場合) – code4kix

関連する問題