目录
一、引入Rabbitmq概念
二、Rabbitmq安装
三、代码编写
生产者
消费者
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台上的。所有主要的编程语言均有与代理接口通讯的客户端库。
RabbitMq的特性:
(1)可靠性:使用一些机制来保证可靠性,如持久化、传输确认、发布确认
(2)灵活的路由:在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现,针对复杂的路由功能,可以将多个Exchage绑定在一起,也通过插件机制实现自己的Exchange
(2)消息集群:多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker
(4)高可用:队列可以在集群中的机器上进行镜像,使得在部分节点出现问题的情况下队列仍然可用
(5)多种协议:RabbitMQ迟滞多种消息队列协议,比如STOMP、MQTT等
(6)多语言客户端:RabbitMQ几乎迟滞所有常用语言,比如java、net、ruby
(7)管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面
详情请点:Docker安装RabbitMq超详细步骤_菜鸟小邓的博客-CSDN博客
引入依赖 pom.xml
org.springframework.cloud
spring-cloud-starter-stream-rabbit
配置文件application.yaml
server:
port: 8801
spring:
application:
name: cloud-stream-provider
cloud:
stream:
binders: #配置要绑定的rabbitmq的服务信息
rabbit: #表示定义的名称,用于bingding的整合
type: rabbit
enviroment:
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
bindings: #服务的整合处理
output:
destination: studentExchange #表示要使用的exchange的名称定义
content-type: application/json
binder: rabbit
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
生产者发送消息方法 MessageProvideImpl
@EnableBinding(Source.class)
public class MessageProvideImpl implements IMessageProvide {
@Resource
MessageChannel output;
//生产数据放入list
public static List list = new ArrayList<>();
{
for (int i = 1; i <= 100000; i++) {
list.add(String.valueOf(i));
}
}
/**
* RabbitMq
* @return
*/
@Override
public String sendRabbit() {
for (String e:list
) {
MessageBuilder messageBuilder = MessageBuilder.withPayload(e);
this.output.send(messageBuilder.build());
}
return "Rabbit 发送成功!";
}
接口IMessageProvide
public interface IMessageProvide { String sendRabbit(); }
控制层 SendMessageController
@RestController
public class SendMessageController {
@Autowired
IMessageProvide iMessageProvide;
/**
* rabbitmq生产者
* @return
*/
@GetMapping("/sendRabbitmq")
public String sendMessageRabbitmq(){
return iMessageProvide.sendRabbit();
}
}
在启动类加上注解 @EnableBinding(StreamClient.class) 后启动。
配置文件application.yaml
注意⚠️若是需要多消费者消费,则修改consumer.concurrency: 的值即可,但是创建的分区数不能小于消费者数量。
server:
port: 8802
spring:
application:
name: cloud-stream-consumer
cloud:
stream:
binders: #配置要绑定的rabbitmq的服务信息
defaultRabbit: #表示定义的名称,用于bingding的整合
type: rabbit
enviroment:
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
bindings: #服务的整合处理
input:
destination: studentExchange #表示要使用的exchange的名称定义
content-type: application/json
group: groupA
consumer.concurrency: 1 #设置该消费者的线程数
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
消费数据并打印第一条和最后条数据的时间,查看单个消费者与多消费者所消费的时间,或前往rabbitmq管理界面查看消费数据的吞吐量。
@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListener {
/**
* rabbitmq生产者8802
* @param message
*/
@StreamListener(Sink.INPUT)
public void input(String message){
if (Integer.parseInt(message)==1 || Integer.parseInt(message)==100000) {
System.out.println("消费者8802第"+message+"条数据消费时间:"
+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS").format(new Date()));
}
}
}
例如结果: