RabbitMQ with Spring Boot

作者: whthomas | 来源:发表于2016-05-23 20:29 被阅读3378次

    Spring项目下有两个项目和RabbitMQ有关:

    • spring-amqp
    • spring-rabbit

    其中spring-amqp是基础框架,spring-rabbitspring-amqpRabbitMQ实现。

    如果希望在Spring Boot中使用RabbitMQ只需要在pom.xml中使用amqpstarter就可以了。

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

    在配置文件application.properties中添加

    mq.rabbit.host=127.0.0.1
    mq.rabbit.port=5672
    mq.rabbit.virtualHost=/test
    mq.rabbit.username=test
    mq.rabbit.password=123456
    

    设置一个监听的业务类,实现接口MessageListener

    public class Receiver implements MessageListener {
    
        @Override
        public void onMessage(Message message) {
            System.out.println("=================");
            System.out.println(message);
            System.out.println("=================");
        }
    }
    

    这里写的比较简单,可以利用Spring提供的SimpleMessageConverter来将Message类转换成对应的业务对象。

    使用配置类RabbitMQConfiguration来连接RabbitMQ:

    @Configuration
    public class RabbitMQConfiguration {
    
        final static String TEST_QUEUE_NAME = "test_queue";
        final static String TEST_EXCHANGE_NAME = "test_exchange";
        final static String ROUTING_KEY="test";
    
        // RabbitMQ的配置信息
        @Value("${mq.rabbit.host}")
        private String mqRabbitHost;
        @Value("${mq.rabbit.port}")
        private Integer mqRabbitPort;
        @Value("${mq.rabbit.username}")
        private String mqRabbitUsername;
        @Value("${mq.rabbit.password}")
        private String mqRabbitPassword;
        @Value("${mq.rabbit.virtualHost}")
        private String mqRabbitVirtualHost;
        
        // 建立一个连接容器,类型数据库的连接池。
        @Bean
        public ConnectionFactory connectionFactory() {
            CachingConnectionFactory connectionFactory =
                    new CachingConnectionFactory(mqRabbitHost, mqRabbitPort);
    
            connectionFactory.setUsername(mqRabbitUsername);
            connectionFactory.setPassword(mqRabbitPassword);
            connectionFactory.setVirtualHost(mqRabbitVirtualHost);
    
            return connectionFactory;
        }
    
        @Bean
        public AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory) {
            return new RabbitAdmin(connectionFactory);
        }
        
        // RabbitMQ的使用入口
        @Bean
        public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
            return new RabbitTemplate(connectionFactory);
        }
        
        // 要求RabbitMQ建立一个队列。
        @Bean
        public Queue myQueue() {
            return new Queue(TEST_QUEUE_NAME);
        }
        
        // 声明一个监听容器
        @Bean
        SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, Receiver listenerAdapter) {
    
            SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            container.setQueueNames(new String[]{TEST_QUEUE_NAME});
            container.setMessageListener(listenerAdapter);
    
            return container;
        }
        
        // 在spring容器中添加一个监听类
        @Bean
        Receiver receiver() {
            return new Receiver();
        }
        // 定义一个直连交换机
        @Bean
        DirectExchange exchange() {
            return new DirectExchange(TEST_EXCHANGE_NAME);
        }
        // 要求队列和直连交换机绑定,指定ROUTING_KEY
        @Bean
        Binding binding(Queue queue, DirectExchange exchange) {
            return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
        }
    
    }
    

    然后启动Application类,Spring Boot的项目就会一直监听RabbitMQ队列的情况。

    相关文章

      网友评论

      • 互联网修真院:这个消费者是不是得写个单独的项目
        互联网修真院:@小叶檀 嗯嗯 如果考虑到太耗时可以做成单独服务 并发处理:blush::blush::blush:
        whthomas:生产环境中是会需要额外的消费者服务器处理生产者发送的数据,如果是自己测试放在同一个项目里面也是没有问题的呢。
      • 月之痕奶奶: @Bean
        public AmqpAdmin amqpAdmin() {
        return new RabbitAdmin(this.connectionFactory());
        }

        // RabbitMQ的使用入口
        @Bean
        public RabbitTemplate rabbitTemplate() {
        return new RabbitTemplate(this.connectionFactory());
        }

        这里用this.connectionFactory() 感觉不妥,这样connectionFactory就不是单例的了
        whthomas:@月之痕奶奶 确实不妥,已经改正,谢谢你的提醒呢。 : )

      本文标题:RabbitMQ with Spring Boot

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