SpringBoot 集成RabbitMQ

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!

你可能感兴趣的:(SpringBoot 集成RabbitMQ)