2016-07-13 10 views
0

JmsTemplateを使用してIBM MQキューとの間でメッセージの送受信を行っています。 私のアプリケーションはWebSphereアプリケーションサーバー8.5にインストールされており、接続を取得するためにjndiルックアップを使用します。Spring JmsTemplateとWebSphere Application Serverの接続jndi参照

私のSpring Bean:

<bean id="jmsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jndiTest" /> 
    <property name="lookupOnStartup" value="false" /> 
    <property name="cache" value="true" /> 
    <property name="proxyInterface" value="javax.jms.QueueConnectionFactory" /> 
</bean> 

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="jmsQueueConnectionFactory" /> 
    <property name="receiveTimeout" value="10000" /> 
    <property name="sessionAcknowledgeMode" value="1" /> 
</bean> 

<bean id="mqServerDao" class="MqServerDao" > 
    <constructor-arg name="jmsTemplate" ref="jmsTemplate" /> 
</bean> 

私のJavaクラス:

public class MqServerDao { 

    private JmsTemplate jmsTemplate; 

    public MqServerDao(JmsTemplate jmsTemplate) { 
     this.jmsTemplate = jmsTemplate; 
    } 

    public String write(byte[] request, final String correlationId) 
            throws Exception { 

     MQQueue mqQueue = new MQQueue(MQ_INPUT_QUEUE); 
     mqQueue.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ); 

     MqRequestMessageCreator messageCreator = new MqRequestMessageCreator(
             request, correlationId); 
     jmsTemplate.send(mqQueue, messageCreator); 
     return messageCreator.getMessageId(); 
    } 

    public byte[] read(String messageId, String correlationId) throws Exception { 

     MQQueue mqQueue = new MQQueue(MQ_OUTPUT_QUEUE); 
     mqQueue.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ); 

     String messageSelector = "JMSCorrelationID = 'ID:" + correlationId 
             + "' AND JMSMessageID = '" + messageId + "'"; 
     TextMessage receiveMessage = (TextMessage) jmsTemplate.receiveSelected(
             mqQueue, messageSelector); 
     return receiveMessage.getText().getBytes(); 
    } 
} 

これはそれを行うための正しい方法であれば、私は不思議と私はいくつかの質問を持っている:

  1. されていますCachingConnectionFactoryを追加することをお勧めしますか、またはche接続を管理するアプリケーションサーバー自体ですか?
  2. これはJmsTemplateを使用する正しい方法ですか? MqServerDaoの "write"メソッドが同時に2回呼び出されても安全ですか?または、 "書き込み"メソッドと "読み取り"メソッドの中に新しいJmsTemplateインスタンスを作成しますか?

答えて

1
  1. WebSphereが接続を管理します。 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.htmlから:

のJava EE環境では、ConnectionFactoryのは、JNDI経由でネーミングコンテキストアプリケーションの環境から得 であることを確認してください。 アプリケーションサーバーは通常、プールされたトランザクション対応の ファクトリを公開します。

は、 JmsTemplate含む
  • スプリングテンプレートクラスは、再利用可能な、スレッドセーフシングルトンであるように設計されています。あなたは間違いなく新しいものを作成し続けたいとは思わない。
  • 私はこれに関する正式な参照を探しましたが、見つけられませんでした。 (あなたはそれが上記のJavaDocリンクになると思いたいIMO、Springのドキュメントは、多くの場合、希望するビットを残します。)私は、これまで見つけることができるベストは言うこれ、this description of RestTemplateた:

    を概念的には、それは非常にありますJdbcTemplate、JmsTemplate、および に似ています。これは、Spring Frameworkやその他の のポートフォリオプロジェクトにあるさまざまなテンプレートです。これは、RestTemplateが一度構築された場合に、 スレッドセーフであり、コールバックを使用して の操作をカスタマイズできることを意味します。

    関連する問題