在之前的文章(【IBM MQ相关】IBM MQ介绍以及通过docker安装、与Spring Boot集成)中,简单的介绍了IBM MQ通过Java平台的JMS API,与Spring Boot集成。
为什么说是简单呢?因为用到的配置都是默认的,哪怕将这些配置从application.properties删掉,也是可以运行的:
ibm.mq.queueManager=QM1
ibm.mq.channel=DEV.ADMIN.SVRCONN
ibm.mq.connName=localhost(1414)
ibm.mq.user=admin
ibm.mq.password=passw0rd
1. 创建自己的QueueManager
1.1 queue manager介绍
Before you can use messages and queues, you must create and start at least one queue manager and its associated objects. A queue manager manages the resources associated with it, in particular the queues that it owns. It provides queuing services to applications for Message queuing Interface (MQI) calls and commands to create, modify, display, and delete IBM® MQ objects.
使用message/queue之前,必须要先创建一个queue manager。
从IBM MQ console的学习资料中了解:
可以看到队列管理器下面,有自己的Queues, Topics, Subscriptions, Communications(channel相关):
1.2 创建自己的QueueManager
使用docker创建的时候,MQ_QMGR_NAME不再是默认的QM1,改为QM1TEST,同时volume也新指定为qm1testdata:
docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1TEST --volume qm1testdata:/mnt/mqm --publish 1414:1414 --publish 9443:9443 --detach --env MQ_APP_PASSWORD=passw0rd ibmcom/mq:latest
这时候,在程序中只需要修改ibm.mq.queueManager=QM1TEST即可。
2. 创建自己的channel
参考:www.youtube.com/watch?v=Jqz…
channel介绍
To configure the communication links between IBM MQ MQI clients and servers, decide on your communication protocol, define the connections at both ends of the link, start a listener, and define channels.
In IBM MQ, the logical communication links between objects are called channels. The channels used to connect IBM MQ MQI clients to servers are called MQI channels. You set up channel definitions at each end of your link so that your IBM MQ application on the IBM MQ MQI client can communicate with the queue manager on the server.
在IBM MQ的client与server之间通信,必须创建communicaton protocol:connections / listener / channels。在IBM MQ中,client与server之间的交互,需要使用到MQI Channels。
可以看到目前我们使用的是默认的channel,叫DEV.ADMIN.SVRCONN:
2.2 使用另一个用户来连接
ibm.mq.queueManager=QM1TEST
ibm.mq.channel=DEV.ADMIN.SVRCONN
ibm.mq.connName=localhost(1414)
ibm.mq.user=admin
ibm.mq.password=passw0rd
用户列表:
我们目前的配置是user=admin,假如我们改成app(另一个用户),那么会报错:
2022-07-22 14:56:15.130 ERROR 82518 --- [ntContainer#0-1] o.s.j.l.DefaultMessageListenerContainer : Could not refresh JMS Connection for destination 'DEV.QUEUE.1' - retrying using FixedBackOff{interval=5000, currentAttempts=8, maxAttempts=unlimited}. Cause: JMSWMQ2013: 为队列管理器“QM1TEST”提供的安全性认证无效,连接方式为“Client”,主机名为“localhost(1414)”。; nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ 调用失败,完成代码为“2”(“MQCC_FAILED”),原因码为“2035”(“MQRC_NOT_AUTHORIZED”)。
针对这个问题,参考:www.ibm.com/docs/en/ibm…
CHLAUTH rules are used to determine if a channel can be started, and they allow mapping, through MCAUSER to another user Id.
有两种方式:
- 添加更多的CHLAUTH规则来控制访问权限。
- 临时的关闭CHLAUTH规则。
来看看如何关闭CHLAUTH规则:
使用docker exec进入容器terminal (7d0ed7c26492是容器id):
docker exec -it 7d0ed7c26492 bash
输入runmqsc QM名称 (run MQSC commands) :
runmqsc QM1TEST
紧接着输入:DISPLAY QMGR
可以看到目前的CHLAUTH是enabled的状态,即开着:
输入:ALTER QMGR CHLAUTH (DISABLED)将状态置成disabled:
可通过DISPLAY QMGR再次检查状态是否已经生效。
【测试】关闭CHLAUTH后,可以使用user=app连接IBM MQ。
2.3 在程序中直接使用未知的channel会报错
我们在程序中直接使用未知的channel做下测试:
ibm.mq.channel=QM1TEST.ADMIN.unknown
报错:Caused by: com.ibm.msg.client.jms.DetailedJMSException: JMSCC0005: 不允许对“XMSC_WMQ_CHANNEL”使用指定的值“QM1TEST.ADMIN.unknown”。
2.3 通过console创建一个新的channel
创建一个名为QM1TEST.ADMIN.TEST,类型为服务器连接的Channel,点击【创建】即可创建出新的channel了。:
在程序中修改application.properties中的内容为:
ibm.mq.queueManager=QM1TEST
ibm.mq.channel=QM1TEST.ADMIN.TEST
ibm.mq.connName=localhost(1414)
ibm.mq.user=app
ibm.mq.password=passw0rd
参照#2.2,把CHLAUTH关闭,那么测试能连接成功并且收发message。
如果CHLAUTH=ENABLED,那么会报错:原因码为“2035”(“MQRC_NOT_AUTHORIZED”)。
那么如何解决CHLUTH=ENABLED的情况下,即不关闭CHLAUTH,也能使用app用户连接呢?
可以登陆到console:https://localhost:9443/ibmmq/console/#/
进入队列管理器-查看配置:
点击安全性 - 通道认证 - 创建:
规则类型:【允许】,选择:【客户机应用程序用户标识】
输入通道名称以及初中生户机用户标识:
这样子之后,就可以用user=app来连接了。