SpringBoot + camel+IBM MQ实现消息队列处理

前提工作:

相关资源:

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 就可以

  1. 新建队列 输入队列名 BT01 即可
  1. 创建通道

这里选择服务器连接通道,名称 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中在新建的队列上发送消息

相关推荐
z_鑫2 小时前
SpringCloud FeignClient 中 Bean 重复注册冲突解决方案解析
java·spring boot·spring cloud
Amour恋空2 小时前
SpringBoot+Lombok+Logback实现日志
spring boot·后端·logback
孫治AllenSun2 小时前
【线程池】优化等待队列和拒绝策略
java·spring boot·spring cloud
毕设源码-邱学长3 小时前
【开题答辩全过程】以 基于Spring Boot的体育场地预约管理系统为例,包含答辩的问题和答案
java·spring boot·后端
青槿吖3 小时前
第二篇:告别XML臃肿配置!Spring注解式IOC/DI保姆级教程,从入门到真香
xml·java·开发语言·数据库·后端·sql·spring
摇滚侠4 小时前
讲一讲 SpringMVC,线程变量 ThreadLocal 的使用
java·spring boot·intellij-idea
kuntli4 小时前
BIO NIO AIO核心区别解析
java
Javatutouhouduan4 小时前
京东内部强推HotSpot VM源码剖析笔记(2026新版)
java·jvm·java虚拟机·校招·java面试·java程序员·互联网大厂