美文网首页程序员
SpringBoot 集成RabbitMQ

SpringBoot 集成RabbitMQ

作者: 阿懒土灵 | 来源:发表于2018-07-06 16:27 被阅读18次

    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中增加

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    

    配置
    在启动类中增加:

    @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

        本文链接:https://www.haomeiwen.com/subject/bzlbuftx.html