WebSphere Application Server上的Spring JmsTemplate和连接jndi查找

时间:2016-07-13 15:16:22

标签: spring connection websphere jndi jmstemplate

我正致力于使用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的正确方法吗?如果&#34;写&#34;是否安全? MqServerDao的方法同时被调用两次?或者我会在#34内写一个新的JmsTemplate实例;写&#34;和&#34;阅读&#34;方法

1 个答案:

答案 0 :(得分:1)

  1. WebSphere将为您管理连接。来自http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.html
  2.   

    在Java EE环境中,确保ConnectionFactory是   通过JNDI从应用程序的环境命名上下文中获取;   应用程序服务器通常暴露池化,事务感知   那里的工厂。

    1. Spring模板类,包括JmsTemplate,旨在成为可重用,线程安全的单例。你绝对不想继续创造新的。
    2. 我找了一个关于此的权威参考,但找不到。 (你认为它将出现在上面的JavaDoc链接中.IMO,Spring的文档经常会有一些不足之处。)到目前为止我能找到的最好的是this description of RestTemplate,其中说: / p>

        

      从概念上讲,它与JdbcTemplate,JmsTemplate和   Spring Framework和其他中找到的各种其他模板   组合项目。这意味着,例如,RestTemplate是   线程安全一旦构造,你可以使用回调   定制其业务。