Spring Boot JMS與IBM WebSphere MQ集成配置

Spring Boot JMS與IBM WebSphere MQ集成配置

[TOC]java

前言

Spring Boot做爲簡化Spring開發的框架,已經爲咱們集成了ActiveMQ和RabbitMQ。只需在Spring Boot配置幾個MQ的鏈接方式便可開箱即用。大大簡化了開發配置過程。 Spring的JavaConfig相比傳統的XML的配置方式使得配置更加的可靠和方便。 本文將會說明如何用JavaConfig的方式將Spring與IBM WebSphere MQ(如下簡稱IBM MQ)集成配置,也能夠做爲其餘MQ的配置參考。spring

開發工具

  • IntelliJ Idea
  • JDK 1.8.0_121
  • Maven

解決依賴

獲取IBM MQ依賴包

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文件,添加如下三個依賴,分別爲服務器

  • spring-boot-starter-activemq:即Spring JMS
  • javax.jms-api
  • mq.allclient:即上一步中安裝到本地的包
<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>

MQ鏈接參數

配置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

注入鏈接參數

創建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;
}

配置JMS模板

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")便可。


有問題請留言

相關文章
相關標籤/搜索