[TOC]java
Spring Boot做爲簡化Spring開發的框架,已經爲咱們集成了ActiveMQ和RabbitMQ。只需在Spring Boot配置幾個MQ的鏈接方式便可開箱即用。大大簡化了開發配置過程。 Spring的JavaConfig相比傳統的XML的配置方式使得配置更加的可靠和方便。 本文將會說明如何用JavaConfig的方式將Spring與IBM WebSphere MQ(如下簡稱IBM MQ)集成配置,也能夠做爲其餘MQ的配置參考。spring
IBM MQ相關的鏈接依賴包爲com.ibm.mq.allclient.jar
,該包不存在於公共Maven倉庫,因此咱們須要找到該依賴包並手動安裝到咱們本機的Maven倉庫中。 該依賴包位於[IBM MQ 安裝路徑]\java\lib
下,Windows下的默認安裝路徑爲C:\Program Files\IBM\WebSphere MQ\
,Linux下的默認安裝路徑爲/opt/mqm/
。能夠將該包複製到開發機上。 經過如下命令安裝該包到本地倉庫api
mvn install:install-file -Dfile=[jar包所在路徑] -DgroupId=com.ibm -DartifactId=mq.allclient -Dversion=1.0 -Dpackaging=jar
在Idea中能夠按四次Shift鍵調出全局搜索框,鍵入Execute Maven Goal,等待搜索結果後按回車,便可執行Maven命令,在此執行命令時不須要鍵入命令開頭的
mvn
。緩存
編輯項目pom.xml文件,添加如下三個依賴,分別爲服務器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>javax.jms</groupId> <artifactId>javax.jms-api</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>com.ibm</groupId> <artifactId>mq.allclient</artifactId> <version>1.0</version> </dependency>
配置Spring Boot配置文件,application.yml,此處用的是yaml格式配置文件,application.properties的配置方法能夠參考Spring Boot的說明。app
project: mq: host: 192.168.1.180 port: 1416 queue-manager: QM #隊列管理器 channel: mqm.SVRCONN #服務器鏈接通道 username: mqm #用戶名 password: 123456 #密碼 receive-timeout: 2000 #鏈接超時
創建JmsConfig
類,添加註解@Configuration
,並將以上屬性注入到此類。框架
@Configuration public class JmsConfig { @Value("${project.mq.host}") private String host; @Value("${project.mq.port}") private Integer port; @Value("${project.mq.queue-manager}") private String queueManager; @Value("${project.mq.channel}") private String channel; @Value("${project.mq.username}") private String username; @Value("${project.mq.password}") private String password; @Value("${project.mq.receive-timeout}") private long receiveTimeout; }
在JmsConfig類添加如下方法。spring-boot
CCSID要與鏈接到的隊列管理器一致,Windows下默認爲1381,Linux下默認爲1208。1208表示UTF-8字符集,建議把隊列管理器的CCSID改成1208工具
@Bean public MQQueueConnectionFactory mqQueueConnectionFactory() { MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory(); mqQueueConnectionFactory.setHostName(host); try { mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT); mqQueueConnectionFactory.setCCSID(1208); mqQueueConnectionFactory.setChannel(channel); mqQueueConnectionFactory.setPort(port); mqQueueConnectionFactory.setQueueManager(queueManager); } catch (Exception e) { e.printStackTrace(); } return mqQueueConnectionFactory; }
如不須要帳戶密碼連接能夠跳過此步,直接將
mqQueueConnectionFactory
注入下一步的緩存鏈接工廠。開發工具
@Bean UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(MQQueueConnectionFactory mqQueueConnectionFactory) { UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter(); userCredentialsConnectionFactoryAdapter.setUsername(username); userCredentialsConnectionFactoryAdapter.setPassword(password); userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory); return userCredentialsConnectionFactoryAdapter; }
不配置該類則每次與MQ交互都須要從新建立鏈接,大幅下降速度。
@Bean @Primary public CachingConnectionFactory cachingConnectionFactory(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) { CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(); cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter); cachingConnectionFactory.setSessionCacheSize(500); cachingConnectionFactory.setReconnectOnException(true); return cachingConnectionFactory; }
不使用事務能夠跳過該步驟。如需使用事務,可添加註解@EnableTransactionManagement
到程序入口類中,事務的具體用法可參考Spring Trasaction。
@Bean public PlatformTransactionManager jmsTransactionManager(CachingConnectionFactory cachingConnectionFactory) { JmsTransactionManager jmsTransactionManager = new JmsTransactionManager(); jmsTransactionManager.setConnectionFactory(cachingConnectionFactory); return jmsTransactionManager; }
JmsOperations爲JmsTemplate的實現接口。
重要:不設置setReceiveTimeout時,當隊列爲空,從隊列中取出消息的方法將會一直掛起直到隊列內有消息
@Bean public JmsOperations jmsOperations(CachingConnectionFactory cachingConnectionFactory) { JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory); jmsTemplate.setReceiveTimeout(receiveTimeout); return jmsTemplate; }
可直接使用jmsOperations的convertAndSend(String, Object)方法,第一個參數爲隊列名稱,第二個參數爲需發送的對象。
重要:發送的對象需實現序列化接口
@Autowired JmsOperations jmsOperations; public void send(User user){ jmsOperations.convertAndSend("QUEUE.USER", user); }
可直接使用jmsOperations的receiveAndConvert(String)方法,第一個參數爲隊列名稱。
@Autowired JmsOperations jmsOperations; public void receive(User user){ jmsOperations.receiveAndConvert("QUEUE.USER"); }
如需使用事務,只需在方法添加註解@Transactional(value = "jmsTransactionManager")
便可。
有問題請留言