
Java开发人员在使用JMS接口时,通常更喜欢使用Spring Framework。 通过提供通用模式的模板,Spring可以简化新应用程序的编码,并且已经与MQ JMS类一起成功使用了很多年。 Spring JmsTemplate类是一个关键接口,但是它仍然取决于代码中的配置和依赖关系。
Spring框架包括满足各种需求的各种模块。 这样的组件之一就是Spring Boot。 Spring Boot入门者可以方便地调出使用特定技术所需的所有依赖项和自动配置库。 与直接使用诸如JmsTemplate之类的类相比,这使得开始新的应用程序和技术变得非常容易。 那么,我们如何利用对MQ应用程序的这种轻松访问呢?
由
@middle_java翻译
马克·泰勒发表于04/03/2018 /更新12/06/2018
11条评论在
本文中,我描述了如何直接从
Maven Central Repository Java下载MQ类。 现在,我们将使用它来创建
用于MQ的
Spring Boot Starter 。 您可以从
GitHub下载该模块的完整源代码。
MQ Spring Boot入门
首先,我们需要一个正在运行的队列管理器。 然后,我们将创建一个访问此队列管理器的应用程序。
在容器中启动队列管理器
为了快速入门,可以将
IBM MQ容器
用于开发人员 ,该容器运行服务器进程。 启动此容器时,默认情况下会创建几个对象,并且它们的定义对于自动配置模块是已知的。 默认值对应于容器队列管理器所需的值。
这意味着您可以使用Docker环境启动队列管理器并连接到它,而无需其他设置。 您可以使用以下命令在Linux上启动容器:
docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 \ --publish 1414:1414 \ --publish 9443:9443 \ --detach \ ibmcom/mq
应用实例
它使用与《
Spring JMS入门指南》中的JMS应用程序模型一致的方法。 我遵循了将该项目导入Eclipse工作区的路径,并使用了
gradle构建
过程 ,但是基于
maven的过程也可以工作。 作为练习,我从命令行使用了maven配置,而不是Eclipse IDE。
该示例中的相同代码经过最小的修改即可与MQ一起使用:
- 修改依赖项列表中的源消息传递提供程序以指向IBM MQ包。
- 将Application.java(示例中使用“邮箱”)中的队列名称更改为“ DEV.QUEUE.1”-这是Docker容器中的Developer配置预定义的队列。 如果不使用默认的Developer配置参数,则必须将队列名称设置为与现有队列相同,或者定义相应的新队列。
修改后的控制编译的
build.gradle文件现在具有:
dependencies { compile("com.ibm.mq:mq-jms-spring-boot-starter:+") compile("com.fasterxml.jackson.core:jackson-databind") }
如果您更喜欢使用Maven,则
pom.xml中的相应部分如下:
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>mq-jms-spring-boot-starter</artifactId> <version>0.0.3</version> </dependency> </dependencies>
唯一真正的区别是,在Maven配置中指定了特定版本的MQ Spring Boot模块。
默认配置
MQ Boot Starter配置属性名称以ibm.mq前缀开头。 默认情况下的属性
ibm.mq.queueManager=QM1 ibm.mq.channel=DEV.ADMIN.SVRCONN ibm.mq.connName=localhost(1414) ibm.mq.user=admin ibm.mq.password=passw0rd
它们对应于Docker容器的默认值。
高级配置选项
如果已经具有要使用的正在运行的MQ队列管理器,则可以通过指定覆盖值来轻松更改缺省配置。 队列管理器可以是本地服务,甚至可以是
IBM Cloud上托管的服务。 Java项目中的
application.properties文件是将这些属性排除在项目之外的一种方法。 配置生效,无需更改任何代码。
指定队列管理器属性的名称:
ibm.mq.queueManager=QM1
对于客户端与队列管理器的连接,还必须设置
ibm.mq.channel ibm.mq.connName
如果未指定channel或connName,则假定使用本地队列管理器。 配置组件还支持一些与TLS相关的属性。 在README文件中对其进行了更详细的描述,但是其默认值为null。 您可能还需要安装
ibm.mq.user ibm.mq.password=passw0rd
覆盖默认值。 如果队列管理器允许,这些属性可以保留为空白以使用操作系统的本地用户标识而不进行身份验证。
application.properties文件的示例内容:
ibm.mq.queueManager=QM1 ibm.mq.channel=SYSTEM.DEF.SVRCONN ibm.mq.connName=server.example.com(1414) ibm.mq.user=user1 ibm.mq.password=passw0rd
之后,Spring Boot将创建一个ConnectionFactory,该工厂可用于与队列管理器进行交互。
测试示例程序
您可以使用
gradle bootRun
运行示例程序。 或者使用maven运行
mvn package
,然后使用
java -jar ./target/gs-messaging-jms.jar
执行该程序。 您应该看到以下内容:

在这里,您可以看到应用程序如何放置消息(“发送电子邮件”),然后进行检索。
结论
将Spring Boot Starter与MQ结合使用可使您快速入门。 然后,在启动第一个应用程序之后,可以对其进行扩展以使用其他MQ功能。 尝试后,您可以在此处或在
GitHub问题页面上提供反馈。
更新-2018年6月
今年早些时候,发布了对Spring Boot Framework的重大更新(称为Boot 2),MQ Boot Starter也进行了更新以与该新版本的平台一起使用。 当然,该代码的所有公开发布的版本都可以在
Maven Central Repository中获得 。 为了与Spring Boot 1兼容,您必须继续使用此工件的
0.0.4版本 。
2.0.0版与Boot 2兼容,并将用作将来任何更新的基础。
标签
jms ,
mq ,
mqseries ,
春季 ,
春季靴马克·泰勒 (
Mark E Taylor)关于文章“在Spring Boot上开发MQ JMS应用程序”的11条评论
(仅有用的评论和带有答案的评论)3。
Horacio 2019年5月16日
马克,干得好。
我可以处理多个队列吗?
我看到前缀在@ConfigurationProperties中被硬编码(前缀=“ bm.mq”)
o Mark E Taylor 2019年5月17日
我真的不明白这个问题。 “前缀”指的是基本上显示如何连接到队列管理器的配置属性。 这与连接后应用程序使用的队列无关。 如果您真的想询问有关连接到多个队列管理器的问题,请参阅
github.com/ibm-messaging/mq-jms-spring/issues/7以查看人们使用哪种方法。
7
彼得2018年5月17日
“ Hello.Application”丢失,文件位于github上吗?
o Mark E Taylor 2018年6月12日
为了提取和导入示例应用程序,我使用了Spring Getting Started页面(请参见
spring.io/guides/gs/messaging-jms ),然后进行了一些小的更改。 由于各种原因,我有意不想在此处单独获得此代码。
由
@middle_java翻译。