springboot项目中增加入rabbitmqmq是系统架构设计中的重要一环,mq具有系统间解耦,异步通信,流量削峰等优点,但是引入mq也意味着要增加系统架构的复杂度,需要考虑到mq服务的高可用等问题

rabbitmq

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗

AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全

集成 rabbitmq

  1. pom文件引入rabbitmq依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
  2. application.yml配置文件中增加rabbitmq的相关配置

    spring:
      rabbitmq:
        host: 127.0.0.1
        port: 5672
        username: guest
        password: guest
  3. 创建队列

    /**
     * @author: chenmingyu
     * @date: 2019/5/23 17:29
     * @description: 队列配置类
     */
    @Configuration
    public class RabbitQueueConfig {
    
        /**
         * 测试队列名称
         */
        public static final String TEST_QUEUE = "test";
    
        @Bean
        public Queue Queue() {
            return new Queue(TEST_QUEUE);
        }
    }
    
  4. 生产者实现

    /**
     * @author: chenmingyu
     * @date: 2019/5/23 17:32
     * @description: 生产者
     */
    @Component
    public class TestProduce {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        /**
         * 发送消息
         */
        public void send(){
            System.out.println("发送消息");
            rabbitTemplate.convertAndSend(RabbitQueueConfig.TEST_QUEUE,"this is test");
        }
    }
  5. 消费者实现

    /**
     * @author: chenmingyu
     * @date: 2019/5/23 17:31
     * @description: 消费者
     */
    @Component
    @RabbitListener(queues = RabbitQueueConfig.TEST_QUEUE)
    public class TestConsumer {
    
        @RabbitHandler
        public void process(String msg) {
            System.out.println("消费消息  : " + msg);
        }
    }
  6. 测试

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbootRabbitmqApplicationTests {
    
        @Autowired
        private TestProduce testProduce;
    
        @Test
        public void contextLoads() {
            testProduce.send();
        }
    
    }

    输出