Spring3 JmsTemplate与MQ的集成

基于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>
 
 
    <!-- JMS Queue Connection Factory -->
    <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,每次都会创建新的线程,开销较大,故配置了固定的线程池提高效率

你可能感兴趣的:(template)