RabbitMQ是一个消息中间件,负责项目间消息的传递。使用消息中间件可以做到项目间解耦和消息的异步处理。支持多语言开发。
RabbitMQ原理:
首先是在RabbitMQ创建所需的exchange中转站和queue队列。创建exchange和queue可以通过服务器代码实现,也可以通过RabbitMQ提供的web管理界面或者http api来操作。
消息生产者服务器将消息发送到指定的exchange中转站,中转站接收到路由指定,将消息放入exchange通过routekey绑定的queue队列,等待消息被消费。
消息消费者服务器连接到RabbitMQ,通过对指定queue队列的监听来获取消息。
同时RabbitMQ做了消息确认和消息持久化的方案来确保消息是否被消费和crash之后的消息的恢复。
RabbitMQ提供了丰富的http api接口供调用来监控RabbitMQ的运行情况。
spring boot集成RabbitMQ使用:
引入jar包
pom.xml中增加
org.springframework.boot
spring-boot-starter-amqp
配置
在启动类中增加:
@Bean(name = "demoQueue")
public Queue getQueue(){
return new Queue("queueName");
}
@Bean(name = "demoExchange")
TopicExchange exchange() {
return new TopicExchange("exchangeName");
}
@Bean
Binding binding(Queue demoQueue, TopicExchange demoExchange) {
return BindingBuilder.bind(demoQueue).to(demoExchange).with("routingKey");
}
上面这段代码的意思是:创建一个名为queueName的queue和名为exchangeName的exchange,然后通过名为routingKey的路由键将该queue绑定到exchange上。
这一步创建exchange和queue及绑定应该是在消息生成者中。之后才是发送消息。
消息是不会发送到一个不存在的queue上的。
简单的消息发送
@Component
public class MessageSender{
@Autowired
private RabbitTemplate rabbitTemplate;
//发送一个字符串
public void send(String msg) {
this.rabbitTemplate.convertAndSend("exchangeName","routingKey", msg);
}
//发送一个可序列化对象
public void send(Job job) {
this.rabbitTemplate.convertAndSend("exchangeName","routingKey", job);
}
}
convertAndSend()方法提供了很多重载实现。传递的消息类型是object。
另外如果传递对象的话,该对象必须继承了Serializable接口。同时,消息接收者必须有同样的对象类来接收该消息,而且该对象类所处的包路径必须一致才行。
消息发送可以继承RabbitTemplate.ConfirmCallback接口来实现消息发送确认机制。
接收消息
@Component
@RabbitListener(queues = "queueName")
public class RabbitMqReciever {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
@RabbitHandler
public void process(Job job) {
System.out.println("Receiver : " + job);
}
}
注解@RabbitListener()是指定接收消息的名为queueName的queue
如果有消息就根据消息类型的不同来调用不同的方法。
OVER!