一、为什么需要rabbit mq

1、同步变异步

同步:

java rabbitmq发送数据 rabbitmq教程 java_java

异步传统的做法是加个线程池:

java rabbitmq发送数据 rabbitmq教程 java_消息队列_02

异步消息队列MQ:

java rabbitmq发送数据 rabbitmq教程 java_spring_03

解决了:
(1)不用自己实现线程池
(2)解耦

2、高内聚低耦合

java rabbitmq发送数据 rabbitmq教程 java_java rabbitmq发送数据_04


如果在订单服务中,要加微信通知功能。同步方式就要改订单服务代码。用消息队列方式,不用改订单服务一行代码,新增一个微信服务,然后订阅MQ系统消息就可以了

解耦的目的就是,每个服务只关心自己的逻辑业务3、流量削峰

java rabbitmq发送数据 rabbitmq教程 java_spring_05

用户请求过来,先写消息队列,消息队列设置最大值。如果超过最大值则抛弃消息,或者跳转到错误页面。秒杀服务根据消息队列做后续的下单处理

4、什么是队列
队列就像存放商品的仓库或者商店,是生产商品的工厂和购买商品的用户之间的中转站。
(1)队列存储了什么
在RabbitMQ中,信息流从你的应用程序出发,来到RabbitMQ的队列,所有信息可以只存储在一个队列中。
队列可以存储很多的消息,因为它基本上是一个无限制的缓冲区,前提是你的机器有足够的存储空间。
(2)队列和应用程序的关系
多个生产者可以将消息发送到同一个队列中,多个消费者也可以只从同一个队列接收数据。

二、springboot整合rabbitmq

1、pom文件添加

<!--rabbitmq-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2、配置文件添加

spring:
    rabbitmq:
        host: 192.168.3.203
        port: 5672
        username: admin
        password: admin
        virtual-host: my_vhost

注:不设置虚拟host,应用启动会报错 

3、添加发送队列RabbitSenderConfig.java
经测试不用配置这个类,发送端和接收端只要填对queue名称就能发送和接收!

package com.example.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitSenderConfig {

	@Bean
	public Queue queue() {
		//有四个参数
		//name: 队列名称
		//durable: 是否持久化,默认true
		//exclusive: 该队列只能被创建者使用,默认false
		//autoDelete: 长时间不用队列会被自动删除,默认false
		return new Queue("testQueue");
	}
	
}

4、添加消息发送类RabbitController.java

package com.example.web;

import java.util.Date;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(description = "rabbitmq测试接口")
@RestController
@RequestMapping("/rabbit")
public class RabbitController {

	@Autowired
	RabbitTemplate rabbitTemplate;
	
	@ApiOperation("发送一条记录")
	@GetMapping("/send")
	public void send() {
		String msg = "hello" + new Date();
		//第一个参数是queue名称,第二个参数是msg
		rabbitTemplate.convertAndSend("testQueue", msg);
	}
}

5、添加消息接收类RabbitService.java

package com.example.rabbit;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class RabbitService {

	@RabbitListener(queues = "testQueue") //监听队列名称
	public void process(String msg) {
		System.out.println("receiver:" + msg);
	}
}

6、测试并登陆后台查看Queue

java rabbitmq发送数据 rabbitmq教程 java_消息队列_06