• Spring Boot 整合 JMS(Active MQ 实现)


          我们使用jms一般是使用spring-jms和activemq相结合,通过spring Boot为我们配置好的JmsTemplate发送消息到指定的目的地Destination。本文以点到点消息模式为例,演示如何在Spring Boot中整合 JMS 和 Active MQ ,实现 MQ 消息的生产与消费。
         点到点消息模式定义:当消息发送者发送消息,消息代理获得消息后,把消息放入一个队列里,当有消息接收者来接收消息的时候,消息将从队列里取出并且传递给接收者,这时候队列里就没有此消息了。队列Queue的存在使得消息的异步传输成为可能。

    1 安装ActiveMQ

          关于具体的安装步骤,请参考专门介绍安装与部署的另一篇博文《ActiveMQ的安装与部署》。

    2 配置Active MQ 依赖

          关于如何搭建 Spring Boot工程,请移步《基于 intellij IDEA 快速搭建Spring Boot项目》。假设项目已经创建完毕,在项目 pom 文件中加入Active MQ依赖:
     
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-activemq</artifactId>
        <version>2.2.7.RELEASE</version>
    </dependency>

     3 修改application.properties配置文件

          在application.properties中配置Active MQ:

    spring.activemq.broker-url=tcp://localhost:61616
    spring.activemq.in-memory=true
    spring.activemq.pool.enabled=false
    #默认值false,表示点到点模式,true时代表发布订阅模式
    spring.jms.pub-sub-domain=false

     4 创建消息生产者和消费者

          本文以点到点消息模式演示。新增消息生产者:
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsMessagingTemplate;
    import org.springframework.stereotype.Service;
    
    import javax.jms.Destination;
    
    @Service("producer")
    public class Producer {
        /**
         * 也可以注入JmsTemplate,JmsMessagingTemplate对JmsTemplate进行了封装
         */
        @Autowired
        private JmsMessagingTemplate jmsTemplate;
    
        /**
         * 发送消息,destination是发送到的队列,message是待发送的消息
         *
         * @param destination
         * @param message
         */
        public void sendMessage(Destination destination, final String message) {
            jmsTemplate.convertAndSend(destination, message);
        }
    }

           通过JmsMessagingTemplate 的convertAndSend方法向目的地 destination发送消息。 新增消息监听者:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ConsumerListener {
        private static Logger logger = LoggerFactory.getLogger(Consumer.class);
        /**
         * 使用JmsListener配置消费者监听的队列
         * @param receivedMsg 接收到的消息
         */
        @JmsListener(destination = "myDest.queue")
        public void receiveQueue(String receivedMsg) {
            logger.info("Consumer收到的报文为: {}", receivedMsg);
        }
    }

        @JmsListener是Spring 4.1 提供的一个新特性,用于简化JMS开发,只需使用此注解的属性destination指定要监听的目的地【myDest.queue】,即可接收该目的地发送的消息。消费者2 ConsumerListener2 的代码同上,但是日志如下: 

            logger.info("Consumer2收到的报文为: {}", receivedMsg);

     温馨提示,消息消费者和生产者的类上必须加上注解 @Component 或者 @Service,使得消息消费者类就会被委派给Listener类,原理类似于使用SessionAwareMessageListener以及MessageListenerAdapter来实现消息驱动POJO。

    5 测试 MQ

          在Junit测试类中新增测试方法
    import org.apache.activemq.command.ActiveMQQueue;
    import javax.jms.Destination;
    
    @Autowired
    private Producer producer;
    @Test
    public void jmsActiveMqTest() throws InterruptedException {
        Destination destination = new ActiveMQQueue("myDest.queue");
        for (int i = 0; i < 21; i++) {
            producer.sendMessage(destination, String.format("My name is Wiener%s", i));
        }
    }

           控制台显示消费者接收到的消息如下:

    Consumer收到的报文为: My name is Wiener0
    Consumer2 收到的报文为:My name is Wiener1
    Consumer收到的报文为: My name is Wiener2
    Consumer2 收到的报文为:My name is Wiener3
    Consumer收到的报文为: My name is Wiener4
    Consumer2 收到的报文为:My name is Wiener5
    Consumer收到的报文为: My name is Wiener6
    Consumer2 收到的报文为:My name is Wiener7
    ...
          经过上面的五个步骤,spring Boot、Jms 和 Active MQ 就基本上整合完成了,是不是使用起来很方便了!
     

    Reference

     
    1. https://www.cnblogs.com/zfblog/p/7371970.html
    2. JavaEE开发的颠覆者: Spring Boot实战
     
     
  • 相关阅读:
    委托和异步方法
    线程池_ThreadPool
    委托_deleget
    一步一步实现视频播放器client(二)
    mysql忘记password
    POJ 2456 Aggressive cows (二分 基础)
    Fragment小结
    Cocos2d-x粒子系统
    淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树
    C与C++在形參的一点小差别
  • 原文地址:https://www.cnblogs.com/east7/p/13127364.html
Copyright © 2020-2023  润新知