前面给大家介绍过了ActiveMQ,本文开始给大家介绍下另一个消息中间件RabbitMQ。
AMQP (Advanced Message Queuing Protocol ,高级消息队列协议)是 个线路层的协议规范,而不是 API 规范(例如 JMS )。由于 AMQP 是一个线路层协议规范,因此它天然就是跨平台的,就像 SMTP HTTP 等协议 样,只要开发者按照规范的格式发送数据,任何平台都可以通过 AMQP进行消息交互。像目前流行的 StormMQ RabbitMQ 等都实现了 AMQP.
RabbitMQ 一个实现了 AMQP 的开源消息中间件,使用高性能的 Erlang 编写。 RabbitMQ有可靠性、支持多种协议、高可用、支持消息集群以及多语言客户端等特点,在分布式系统中存储转发消息,具有不错的性能表现。
现在的市面上有很多MQ可以选择,比如ActiveMQ、ZeroMQ、Appche Qpid,那问题来了为什么要选择RabbitMQ?
除了Qpid,RabbitMQ是唯一一个实现了AMQP标准的消息服务器; 可靠性,RabbitMQ的持久化支持,保证了消息的稳定性; 高并发,RabbitMQ使用了Erlang开发语言,Erlang是为电话交换机开发的语言,天生自带高并发光环,和高可用特性; 集群部署简单,正是应为Erlang使得RabbitMQ集群部署变的超级简单; 社区活跃度高,根据网上资料来看,RabbitMQ也是首选;
消息生产者,就是投递消息的程序。
消息消费者,就是接受消息的程序。
队列就像存放了商品的仓库或者商店,是生产商品的工厂和购买商品的用户之间的中转站
在 rabbitMQ 中,信息流从你的应用程序出发,来到 Rabbitmq 的队列,所有信息可以只存储在一个队列中。队列可以存储很多信息,因为它基本上是一个无限制的缓冲区,前提是你的机器有足够的存储空间。
多个生产者可以将消息发送到同一个队列中,多个消息者也可以只从同一个队列接收数据。
创建一个SpringBoot项目,并添加如下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
在application.properties中添加RabbitMQ相关的配置
spring.application.name=springcloud-mq
spring.rabbitmq.host=192.168.88.150
spring.rabbitmq.port=5672
spring.rabbitmq.username=dpb
spring.rabbitmq.password=123
# 队列名称
mq.queue.name=hello-queue
目录结构
/**
* @program: springcloud-rabbitmq-demo
* @description: 创建消息队列
* @author: 波波烤鸭
* @create: 2019-05-21 23:18
*/
@Configuration
public class QueueConfig {
@Value("${mq.queue.name}")
private String queueName;
@Bean
public Queue createQueue(){
return new Queue(queueName);
}
}
/**
* @program: springcloud-rabbitmq-demo
* @description: 消费者
* @author: 波波烤鸭
* @create: 2019-05-21 23:26
*/
@Component
public class Receiver {
/**
* 接收消息的方法,采用消息队列监听机制
* @param msg
*/
@RabbitListener(queues = "${mq.queue.name}")
public void process(String msg){
System.out.println("recevier:"+msg);
}
}
/**
* @program: springcloud-rabbitmq-demo
* @description: 消息的发送者
* @author: 波波烤鸭
* @create: 2019-05-21 23:23
*/
@Component
public class Sender {
@Autowired
private AmqpTemplate rabbitAmqpTemplate;
@Value("${mq.queue.name}")
private String queueName;
/**
* 创建发送消息的方法
*/
public void send(String msg){
// 参数: 队列名称 和 消息内容
rabbitAmqpTemplate.convertAndSend("hello-queue",msg);
}
}
@SpringBootApplication
public class SpringcloudRabbitmqDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudRabbitmqDemoApplication.class, args);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringcloudRabbitmqDemoApplication.class)
public class SpringcloudRabbitmqDemoApplicationTests {
@Autowired
private Sender sender;
@Test
public void contextLoads() {
sender.send("你好啊...");
}
}