<?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:p="http://www.springframework.org/schema/p"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-3.2.xsd">
<!-- WebSphere MQ Connection Factory -->
<bean id="targetConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName">
<value>${esbmon.mq.hostname}</value>
</property>
<property name="port">
<value>${esbmon.mq.port}</value>
</property>
<property name="queueManager">
<value>${esbmon.mq.queueManagerName}</value>
</property>
<property name="channel">
<value>${esbmon.mq.channel}</value>
</property>
<!-- com.ibm.mq.jms.JMSC.MQJMS_TP_CLIENT_MQ_TCPIP=1 -->
<property name="transportType" value="1" />
</bean>
<!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory;
MessageListenerContainer已經建立緩存機制,這里直接使用SingleConnectionFactory而不是
CachingConnectionFactory
-->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
<!-- 使用SingleConnectionFactory時,開啟reconnectOnException很重要 -->
<property name="reconnectOnException" value="true"></property>
</bean>
<!-- JMS Destination Resolver -->
<bean id="jmsDestinationResolver"
class="org.springframework.jms.support.destination.DynamicDestinationResolver">
</bean>
<!-- 事務管理器,將messageListener的onMessage方法作為一個事務 -->
<bean id="jmsTransactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<!-- 配置成 jta事物,是消息接受事物和數據庫操作事物失敗都能回滾-->
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="connectionFactory" ref="connectionFactory" />
<property name="sessionTransacted" value="true" />
</bean>
<!-- 任務處理線程池 -->
<bean id="jmsListenerTaskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize">
<value>${esbmon.jmsListenerExecutor.corePoolSize}</value>
</property>
<property name="maxPoolSize">
<value>${esbmon.jmsListenerExecutor.maxPoolSize}</value>
</property>
<property name="keepAliveSeconds">
<value>${esbmon.jmsListenerExecutor.keepAliveSeconds}</value>
</property>
<property name="queueCapacity">
<value>${esbmon.jmsListenerExecutor.queueCapacity}</value>
</property>
<property name="rejectedExecutionHandler">
<bean class="${esbmon.jmsListenerExecutor.handler}" />
</property>
<property name="threadNamePrefix" value="jmsListenerTaskExecutor" />
</bean>
<!-- jms listenercontainer用於異步接受消息,JmsTemplate類用來生產消息和同步接收消息 -->
<!-- container-type:容器的類型, default、simple、default102 或者 simple102 -->
<!-- connection-factory:JMS ConnectionFactory Bean的引用 -->
<!-- task-executor:JMS TaskExecutor Bean的引用 -->
<!-- destination-resolver:DestinationResolver 策略的引用 -->
<!-- message-converter:MessageConverter 策略的引用用 -->
<!-- destination-type:目的地類型,queue、topic 或者 durableTopic -->
<!-- client-id:容器在JMS客戶端的id -->
<!-- acknowledge: JMS消息的確認模式,auto、client、dups-ok 或者 transacted -->
<!-- transaction-manager:PlatformTransactionManager Bean的引用 -->
<!-- concurrency:可激活的Session最大並發數 -->
<!-- prefetch:加載進每個Session的最大消息數,增加這個值會造成並發空閑 -->
<!-- receive-timeout:每次接收消息的超時時間 -->
<!-- cache:緩存級別 -->
<jms:listener-container container-type="default"
connection-factory="jtaTransactionManager" destination-type="queue"
transaction-manager="jmsTransactionManager" task-executor="jmsListenerTaskExecutor"
destination-resolver="jmsDestinationResolver" concurrency="30" prefetch="100"
receive-timeout="3000" acknowledge="transacted">
<!-- id: 容器的Bean名稱 -->
<!-- destination: 目的地的名稱,由DestinationResolver的策略決定 -->
<!-- ref: 處理對象的Bean名稱 -->
<!-- method: 處理器中被調用的方法名, 如果ref指向 MessageListener或SessionAwareMessageListener,則這個屬性可以被忽略 -->
<!-- selector: 可選的消息選擇器 -->
<jms:listener id="svcLogListener" destination="${esbmon.mq.queueName.serviceLog}"
ref="svcLogJmsListener" />
<jms:listener id="sysLogListener" destination="${esbmon.mq.queueName.systemLog}"
ref="sysLogJmsListener" />
<jms:listener id="MqLogListener" destination="${esbmon.mq.queueName.mqSvcLog}"
ref="pubSubLogJmsListener" />
</jms:listener-container>
</beans>