前提工作:
相关资源:
Windows服务器: https://download.csdn.net/download/JavaLLU/92728416
windows图形化界面: https://download.csdn.net/download/JavaLLU/92728418
在本地启动IBM MQ服务 并且 创建 队列 以及设置相关的权限
安装教程请看:https://www.cnblogs.com/oceancaptain/p/17439428.html
使用图形化界面IBM-MQ-Explorer创建队列
1.新建队列管理器,这里设置名字 MyTest 和端口 1416 就可以

- 新建队列 输入队列名 BT01 即可

- 创建通道
这里选择服务器连接通道,名称 SERVERCONN
这个通道新建后状态显示不活跃,只有你客户端连接后才自动变为正在运行

第一步. 配置pom依赖
java
<!-- Apache Camel Spring Boot Starter -->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!-- IBM MQ-->
<!-- Camel JMS 组件 (用于连接 IBM MQ) -->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jms-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!-- IBM MQ 客户端 (必须手动引入,Camel 不包含此包) -->
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mq.allclient</artifactId>
<version>9.2.4.0</version>
</dependency>
<!-- Spring 对JMS的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
第二步 添加yml参数配置(我这里没有用到用户密码)
这里就是我们上面配置好的队列信息
java
# IBM MQ 客户端
ibmmq:
host: 127.0.0.1 # 地址
port: 1416 # 断口
user: '' # 账号
password: '' # 密码
channel: SERVERCONN # 通道名称
manager: MyTest # 队列管理器
ccsid: 1381 # 编码id
receive-timeout: 1000 # 接收超时时间
concurrency: 10-100 # 并发数 下限-上限
queue:
name: BT01 # 队列名称
第三步 创建客户端
java
import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.msg.client.wmq.WMQConstants;
import org.apache.camel.component.jms.JmsComponent;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.jms.connection.SingleConnectionFactory;
import javax.jms.JMSException;
@Configuration
public class MQConnectionConfig {
@Value("${ibmmq.host}")
private String host;
@Value("${ibmmq.port}")
private int port;
@Value("${ibmmq.manager}")
private String queueManager;
@Value("${ibmmq.channel}")
private String channel;
@Value("${ibmmq.user}")
private String username;
@Value("${ibmmq.password}")
private String password;
@Bean
public MQQueueConnectionFactory mqQueueConnectionFactory() throws JMSException {
MQQueueConnectionFactory factory = new MQQueueConnectionFactory();
factory.setHostName(host);
factory.setPort(port);
factory.setQueueManager(queueManager);
factory.setChannel(channel);
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT); // 使用客户端连接模式
// 设置用户名和密码(如果需要)
factory.setStringProperty(WMQConstants.USERID, username);
factory.setStringProperty(WMQConstants.PASSWORD, password);
// 可选:设置CCSID(编码),默认是819
// factory.setCCSID(1208); // UTF-8
return factory;
}
@Bean
public CachingConnectionFactory cachingConnectionFactory(MQQueueConnectionFactory mqQueueConnectionFactory) {
// 使用CachingConnectionFactory来缓存会话、连接和生产者,提升性能
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setTargetConnectionFactory(mqQueueConnectionFactory);
cachingConnectionFactory.setSessionCacheSize(10); // 根据需要调整缓存大小
cachingConnectionFactory.setReconnectOnException(true); // 连接异常时尝试重连
return cachingConnectionFactory;
}
@Bean(name = "ibmMQ")
public JmsComponent jmsComponent(CachingConnectionFactory cachingConnectionFactory) {
// 创建Camel的JMS组件,并指定bean名称,后续在路由中用 "ibmMQ:queue:..." 引用
JmsComponent jmsComponent = new JmsComponent();
jmsComponent.setConnectionFactory(cachingConnectionFactory);
// 设置是否使用消息ID作为消息的JMSCorrelationID,根据业务需求设定
jmsComponent.setUseMessageIDAsCorrelationID(false);
return jmsComponent;
}
第四步 创建队列处理组件
java
@Component
public class IbmMqRoute extends RouteBuilder {
@Value("${ibmmq.queue.name}")
private String queueName;
@Resource
private MqService mqService;
@Override
public void configure() throws Exception {
// 使用配置好的JmsComponent "ibmMQ" 从队列中消费消息
from("ibmMQ:queue:"+queueName)
.routeId("ibmMqConsumer")
.log("Received message from IBM MQ: ${body}")
// .process(exchange -> { ... 你的业务逻辑 ... })
.to("log:received"); // 也可以直接输出到日志
}
}
问题:
Could not refresh JMS Connection for destination 'BT01' - retrying using FixedBackOff{interval=1000, currentAttempts=2, maxAttempts=unlimited}. Cause: JMSWMQ2013: 为队列管理器"test01"提供的安全性认证无效,连接方式为"Client",主机名为"127.0.0.1(1414)"。; nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ 调用失败,完成代码为"2"("MQCC_FAILED"),原因码为"2035"("MQRC_NOT_AUTHORIZED")。
原因:
就是我们MQ权限设置的有问题,在网上看了好多不管用,参考这个博主的有效,直接去掉认证。
IBM MQ安装配置_ibmmq hostname-CSDN博客
操作步骤:
进入MQ安装bin路径下面执行命令:
1、
alter qmgr chlauth(disabled)
2、
ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)
或者直接将连接认证选项置为空,将其完全关闭,指令如下:
ALTER QMGR CONNAUTH(' ') 注:单引号内有空格
在执行完上述两条命令中的任一条后,都需要刷新连接认证的缓存,指令如下:
REFRESH SECURITY TYPE(CONNAUTH)
操作完后我们就可以连接了。
测试
在IBM Explorer中在新建的队列上发送消息


