基于IBM的产品一向对开发者不太友好,特此记录一下Spring JmsTemplate连接MQ的开发过程。
一、连接方式
MQ与大多数消息中间件一样,是标准的消息中间件服务器,提供异构平台之间的消息传递;
客户端连接MQ有两种方式,一是stand-alone,二是基于JNDI连接,两种方式的优缺点再次不在赘述,本文是以stand-alone方式连接,下面直奔主题。
二、Spring Jms配置
<!--WizRtf2Html Charset=0 -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
default-lazy-init="false"
>
<!-- WebSphere MQ Connection Factory -->
<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName">
<value>${app.mq.hostName}</value>
</property>
<property name="port">
<value>${app.mq.port}</value>
</property>
<property name="queueManager">
<value>${app.mq.queueManager}</value>
</property>
<property name="channel">
<value>${app.mq.channel}</value>
</property>
<property name="transportType" value="1" />
</bean>
<bean id="jmsQueueConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="mqConnectionFactory" />
<property name="sessionCacheSize">
<value>${app.jms.connectionFactory.sessionCacheSize}</value>
</property>
</bean>
<!-- JMS Destination Resolver -->
<bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.DynamicDestinationResolver" />
<!-- JMS Queue Template -->
<bean id="jmsTemplateSend" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsQueueConnectionFactory" />
<property name="destinationResolver" ref="jmsDestinationResolver" />
<property name="pubSubDomain" value="false" />
</bean>
<!-- 定义接收者 -->
<bean id="jmsListener" class="cn.com.yitong.mps.push.jms.JmsListener"></bean>
<!-- 接受监听 -->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsQueueConnectionFactory" />
<property name="destinationResolver" ref="jmsDestinationResolver" />
<property name="messageListener" ref="jmsListener" />
<property name="cacheLevelName" value="CACHE_CONSUMER" />
<property name="taskExecutor" ref="jmsListenerTaskExecutor" />
<property name="concurrentConsumers">
<value>${app.jms.listenerContainer.concurrentConsumers}</value>
</property>
<property name="maxConcurrentConsumers">
<value>${app.jms.listenerContainer.maxConcurrentConsumers}</value>
</property>
<property name="destinationName">
<value>${app.jms.listenerContainer.destinationName}</value>
</property>
</bean>
<!--WizRtf2Html Charset=0 -->
<!-- jms监听线程池 -->
<bean id="jmsListenerTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize">
<value>${app.jmsListenerExecutor.corePoolSize}</value>
</property>
<property name="maxPoolSize">
<value>${app.jmsListenerExecutor.maxPoolSize}</value>
</property>
<property name="keepAliveSeconds">
<value>${app.jmsListenerExecutor.keepAliveSeconds}</value>
</property>
<property name="queueCapacity">
<value>${app.jmsListenerExecutor.queueCapacity}</value>
</property>
<property name="threadNamePrefix" value="jmsListenerTaskExecutor" />
</bean>
</beans>
三、客户端jar包(以下jar包maven中央库中没有,需要自己从IBM MQ安装目录中拷贝)
com.ibm.mq.commonservices.jar
com.ibm.mq.defaultconfig.jar
com.ibm.mq.headers.jar
com.ibm.mq.jar
com.ibm.mq.jmqi.jar
com.ibm.mq.jms.Nojndi.jar
com.ibm.mq.pcf.jar
com.ibm.mq.postcard.jar
com.ibm.mq.tools.ras.jar
com.ibm.mqjms.jar
connector.jar
dhbcore.jar
fscontext.jar
jms.jar
jndi.jar
jta.jar
ldap.jar
mqcontext.jar
providerutil.jar
rmm.jar
四、MQ配置
1、建立队列管理器
2、建立通道(需要注意MCA,配制成当前服务器的用户,否则客户端连接会有权限问题)
五、备注
配置中使用了CachingConnectionFactory,为发送提供缓存,可以提高效率;
监听时配置了线程池,Spring默认使用<!--WizRtf2Html Charset=0 -->SimpleAsyncTaskExecutor,每次都会创建新的线程,开销较大,故配置了固定的线程池提高效率