文档章节

Spring Boot JMS与IBM WebSphere MQ集成配置

l
 lzp4ever
发布于 2017/03/29 16:27
字数 1039
阅读 2407
收藏 82

Spring Boot JMS与IBM WebSphere MQ集成配置

[TOC]

前言

Spring Boot作为简化Spring开发的框架,已经为我们集成了ActiveMQ和RabbitMQ。只需在Spring Boot配置几个MQ的连接方式即可开箱即用。大大简化了开发配置过程。 Spring的JavaConfig相比传统的XML的配置方式使得配置更加的可靠和方便。 本文将会说明如何用JavaConfig的方式将Spring与IBM WebSphere MQ(以下简称IBM MQ)集成配置,也可以作为其他MQ的配置参考。

开发工具

  • 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/。可以将该包复制到开发机上。 通过以下命令安装该包到本地仓库

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的说明。

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类添加以下方法。

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


有问题请留言

© 著作权归作者所有

l
粉丝 6
博文 6
码字总数 4680
作品 0
广州
私信 提问
加载中

评论(4)

程序小菜鸟
这个我还没有找到解决方式,当网络恢复后我再次调用,onException(JMSException) 方法,连接可以连上,但是队列监听却掉了,请问您有什么解决方法吗?
程序小菜鸟
在发布程序机器上如果网络中断就会报无法恢复的异常,程序会终止,进程不会消失。
l
lzp4ever 博主

引用来自“飞卿”的评论

大神,Spring Boot 配 IBM MQ 的集群,怎么配呀
配置连接到一个完整仓储库队列管理器,将绑定的类型设定为“MQOO_BIND_AS_Q_DEF”,也就是将配置连接工厂中“WMQConstants.WMQ_CM_CLIENT”改为“MQConstants.MQOO_BIND_AS_Q_DEF”
飞卿
飞卿
大神,Spring Boot 配 IBM MQ 的集群,怎么配呀
JMS如何调用webshere MQ中间件收发消息

问题描述: 有个应用原先是用ibm MQ插件包调用websphere MQ消息并发消息。最近需要进行转移,改用原生的JMS调用,小弟初学,不知道如何通过JMS配置项对应的队列管理器,通道和队列。是否用J...

泥巴刀儿
2014/01/14
1K
2
Eclipse 中的 EJB V3.0 数据库持久化

简介: EJB V3.0 提供了一个关于使用 Java™ 技术实现数据持久化的健壮工具集。使用 EJB 并不会很难。了解如何在 Eclipse 环境中使用这些功能,以及使您的应用程序更紧密地与有用数据集成。虽...

红薯
2010/05/05
805
0
利用 JPA 2.0 二级缓存实现高速数据访问

JPA 是 Java Persistence API 的简称,JPA 1.0 目前只支持一级缓存。JPA 2.0 在 2009 年 12 月发布,作为 Java 6 的标准,JPA 2.0 增加了对二级缓存的支持。WebSphere Application Server V7...

IBMdW
2011/06/10
2.1K
0
Websphere tag文件编译问题

遇到一个websphere上部署的问题. 项目中用到了自定义的tag文件,修改某个tag文件之后替换websphere上的相关tag文件,但是修改并未生效. 遂到webspherehome/profiles/AppSrv/temp/Node01/serve...

Navee7
2013/07/19
68
2
从 JBoss v4.x 迁移到 IBM WAS CE 2.x

将 WebSphere® Application Server 和 Apache Geronimo 的支持和架构作为 JBoss® Application Server 的最佳替代选择。本文帮助您将运行在 JBoss 上的应用程序迁移到 WebSphere Applicatio...

红薯
2009/12/10
686
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
58分钟前
5
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部