我正致力于使用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();
}
}
我想知道这是否是正确的做法,我有一些问题:
答案 0 :(得分:1)
在Java EE环境中,确保ConnectionFactory是 通过JNDI从应用程序的环境命名上下文中获取; 应用程序服务器通常暴露池化,事务感知 那里的工厂。
JmsTemplate
,旨在成为可重用,线程安全的单例。你绝对不想继续创造新的。我找了一个关于此的权威参考,但找不到。 (你认为它将出现在上面的JavaDoc链接中.IMO,Spring的文档经常会有一些不足之处。)到目前为止我能找到的最好的是this description of RestTemplate,其中说: / p>
从概念上讲,它与JdbcTemplate,JmsTemplate和 Spring Framework和其他中找到的各种其他模板 组合项目。这意味着,例如,RestTemplate是 线程安全一旦构造,你可以使用回调 定制其业务。