1

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

私の春の豆:

<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 を追加することをお勧めしますか、それとも接続を管理するのはアプリケーション サーバー自体ですか?
  2. これは JmsTemplate を使用する正しい方法ですか? MqServerDao の「書き込み」メソッドが同時に 2 回呼び出されても安全ですか? または、「書き込み」および「読み取り」メソッド内に新しい JmsTemplate インスタンスを作成しますか?
4

1 に答える 1

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

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

  1. を含む Spring Template クラスは、JmsTemplate再利用可能なスレッドセーフなシングルトンになるように設計されています。あなたは間違いなく新しいものを作り続けたくありません。

これに関する信頼できる参考文献を探しましたが、見つかりませんでした。(上記の JavaDoc リンクにあると思うでしょう。IMO、Spring のドキュメントは、多くの場合、少し不十分です。)これまでに見つけたのは、 RestTemplate のこの説明でした。

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

于 2016-07-15T14:49:24.317 に答える