RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
Message:
消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息体则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
Publisher:
消息的生产者,也是一个向交换器发布消息的客户端应用程序
Exchange:
交换器,用来接收生产者发送的消息并将这些消息给服务器中的队列。
Exchange有4种类型:direct(默认)、fanout、topic、headers,不同类型的Exchange转发消息的策略有所区别。
因为Rabbit是基于Erlang语言编写,所以安装Rabbit前需要先安装Erlang。
这个Erlang安装otp_win64_20.3.exe这个版本就可以了,百度一下这个版本就可以搜到下载的资源,安装教程也有,包括环境变量什么的,这里就不在演示。
然后就需要安装rabbitmq-server-3.7.7.exe百度一下资源,然后安装,安装之后的额目录是这个样子的
打开sbin文件夹,在这个文件夹的里面打开cmd黑窗口,输入rabbitmq-plugins.bat enable rabbitmq_management
启动服务。或者手动开启服务(如下图)
打开之后可以使用http://localhost:15672访问,会出现如下图,让你登录的页面,默认密码和账号都是guest。
这个时候通过localhost是可以登录的,但如果把localhost换成你电脑的本地IP地址就会提示你无法登录。
这个时候你可以选择:1、现用localhost形式登进去,创建一个新的用户名,用新的用户名和密码登录即可。2、找到安装目录ebin下的rabbit.app文件
把第39[]里面的内容清空。如下图即可使用本地IP地址登录。
登录进去之后就如下图
首先需要导入pom依赖
<!-- 引入RabbitMQ模块 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在启动类上标注 == @EnableRabbit == 注解,表示开启基于注解的RabbitMQ
@SpringBootApplication
@EnableRabbit //开启消息中间件
public class SpringBootWebRestfulcrudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebRestfulcrudApplication.class, args);
}
}
@RestController
public class RabbitController {
@Autowired
AmqpAdmin amqpAdmin;
/**
* 创建Exchange和Queue并绑定关系
* 删除
*/
@PublicInterface
@RequestMapping("/test/create")
public void create(){
/**
* 创建Exchange(交换器)
* new DirectExchange:创建什么类型的Exchange
* 里面的参数可根据需要进行填写,如:是否持久化、是否自动删除
*/
amqpAdmin.declareExchange(new DirectExchange("zhao.exchange"));
/**
* 创建Queue(消息队列)
* new Queue:创建Queue
* 参数同理
*/
amqpAdmin.declareQueue(new Queue("zhao.queue",true));
/**
* 创建绑定规则
* 参数1:目的地
* 参数2:队列(QUEUE)
* 参数3:Exchange名称
* 参数4:路由键
* 参数5:消息头
*/
amqpAdmin.declareBinding(new Binding("zhao.queue",Binding.DestinationType.QUEUE,
"zhao.exchange","zhao.ha",null));
//删除对应的操作
//amqpAdmin.deleteExchange("zhao.exchange");
//amqpAdmin.deleteQueue("zhao.queue");
}
}
运行访问创建接口,即可创建交换器和消息队列并绑定他们之间的关系
@RestController
public class RabbitController {
/**
* 自动配置
* 1、RabbitAutoConfiguration
* 2、有自动配置连接工厂:ConnectionFactory
* 3、RabbitProperties 封装的 RabbitMQ的配置
* 4、RabbitTemplate: 给RabbitMQ发送和接收消息
* 5、AmqpAdmin:系统管理功能组件
* AmqpAdmin:创建和删除、Queue、Exchange、Binding
*/
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 单播(点对点)
* 给消息中间件发送消息
*/
@PublicInterface
@RequestMapping("/test/convertAndSend")
public void contextLoads(Integer id){
TestUser user = new TestUser();
user.setToken("token");
user.setUserId(id);
user.setUserName("张胜");
user.setUserPass("123456");
//对象被序列化以后发送出去
rabbitTemplate.convertAndSend("exchang.direct","atguigu.emps",user);
}
/**
* 单播(点对点)
* 读取消息中间件中的消息
*/
@PublicInterface
@RequestMapping("/test/receive")
public void receive(){
Object obj = rabbitTemplate.receiveAndConvert("atguigu.emps");
System.out.println(obj);
}
}
可以发送消息和接收消息。这个是你发送了消息需要手动的去接收消息,下面展示发送消息自动接收,发送消息接口不变,然后在service层方法上使用==@RabbitListener==注解即可自动接收消息。
@Service
public class RabbitServiceImpl {
/**
* 直接返回实体对象
* @param user
*/
@RabbitListener(queues = "atguigu.emps")
public void rabbitTest(TestUser user){
System.out.println("收到消息"+user);
}
/**
* 返回消息头等信息
*/
// @RabbitListener(queues = "atguigu.emps")
public void rabbitTests(Message message){
System.out.println("收到消息"+message.getBody());
}
}
控制台就会自动打印接收的消息。