• SpringBoot 集成 JMS 与 IBMMQ 代码示例教程



    前言

    SpringBoot 集成 IBMMQ,实现两个服务间的消息通信


    一、集成 JMS 与 IBMMQ

    1、pom 依赖

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-activemqartifactId>
    dependency>
    
    <dependency>
        <groupId>javax.jmsgroupId>
        <artifactId>javax.jms-apiartifactId>
        <version>2.0.1version>
    dependency>
    
    <dependency>
        <groupId>com.ibm.mqgroupId>
        <artifactId>com.ibm.mq.allclientartifactId>
        <version>9.1.1.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2、yml 配置

    project:  
      mq:
        host: 192.168.1.180				# 服务地址
        port: 1416						# 服务端口
        queue-manager: queueManager		# 队列管理器
        username: username				# 用户名
        password: password				# 密码
        channel: channel     			# 连接通道
        receive-timeout: 2000     		# 连接超时
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、Properties 配置类

    @Data
    @Configuration
    @ConfigurationProperties(prefix = "project.mq")
    public class JmsConfig {
    	
    	/**
    	 * 服务地址
    	 */
        private String host;
    	
    	/**
    	 * 服务端口
    	 */
        private Integer port;
        
    	/**
    	 * 队列管理器
    	 */
        private String queueManager;
        
    	/**
    	 * 用户名
    	 */
        private String username;
        
    	/**
    	 * 密码
    	 */
        private String password;
        
    	/**
    	 * 连接通道
    	 */
        private String channel;
        
    	/**
    	 * 连接超时
    	 */
        private long receiveTimeout;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    4、Factory 连接工厂类

    @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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    CCSID要与连接到的队列管理器一致,Windows下默认为1381,Linux下默认为1208。1208表示UTF-8字符集,建议把队列管理器的CCSID改为1208。

    5、配置连接认证

    @Bean
    UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(MQQueueConnectionFactory mqQueueConnectionFactory) {
        UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
        userCredentialsConnectionFactoryAdapter.setUsername(username);
        userCredentialsConnectionFactoryAdapter.setPassword(password);
        userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
        return userCredentialsConnectionFactoryAdapter;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如不需要账户密码链接可以跳过此步,直接将mqQueueConnectionFactory注入下一步的缓存连接工厂。

    6、配置缓存连接工厂

    @Bean
    @Primary
    public CachingConnectionFactory cachingConnectionFactory(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
        cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
        cachingConnectionFactory.setSessionCacheSize(500);
        cachingConnectionFactory.setReconnectOnException(true);
        return cachingConnectionFactory;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    不配置该类则每次与MQ交互都需要重新创建连接,大幅降低速度。

    7、配置事务管理器

    @Bean
    public PlatformTransactionManager jmsTransactionManager(CachingConnectionFactory cachingConnectionFactory) {
        JmsTransactionManager jmsTransactionManager = new JmsTransactionManager();
        jmsTransactionManager.setConnectionFactory(cachingConnectionFactory);
        return jmsTransactionManager;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    8、配置JMS模板

    @Bean
    public JmsOperations jmsOperations(CachingConnectionFactory cachingConnectionFactory) {
        JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
        jmsTemplate.setReceiveTimeout(receiveTimeout);
        return jmsTemplate;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    JmsOperations为JmsTemplate的实现接口。

    重要:不设置setReceiveTimeout时,当队列为空,从队列中取出消息的方法将会一直挂起直到队列内有消息

    9、消息发送与接收

    1. 发送消息

    可直接使用jmsOperations的convertAndSend(String, Object)方法,第一个参数为队列名称,第二个参数为需发送的对象。

    重要:发送的对象需实现序列化接口

    @Autowired
    JmsOperations jmsOperations;
    
    public void send(User user){
      jmsOperations.convertAndSend("QUEUE.USER", user);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 接收消息

    可直接使用jmsOperations的receiveAndConvert(String)方法,第一个参数为队列名称。

    @Autowired
    JmsOperations jmsOperations;
    
    public void receive(User user){
      jmsOperations.receiveAndConvert("QUEUE.USER");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 开启事务

    如需使用事务,只需在方法添加注解@Transactional(value = “jmsTransactionManager”)即可。


    总结

    使用 SpringBoot JMS 集成 IBMMQ 十分的方便。

  • 相关阅读:
    分布式搜索引擎elasticsearch(一)
    【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问
    IDEA插件开发(10)---Components
    初识Cpp之 三、Cpp预处理器
    第一次笔试【面试】
    零基础非计算机专业转行软件测试可行吗?
    电脑技巧:推荐一款桌面增强工具AquaSnap(附下载)
    JavaEE进阶学习:Spring 的创建和使用
    招投标系统软件源码,招投标全流程在线化管理
    【Shell篇二】Shell变量与字符串
  • 原文地址:https://blog.csdn.net/demo_yo/article/details/133773053