Spring Boot 集成RabbitMQ

RabbitMQ is an open source multi-protocol messaging broker.

前言

参照官方Messaging with RabbitMQ,记录在实战中的一些坑。

搭建RabbitMQ服务

本文使用Docker搭建MQ服务。Docker部署服务,快捷、方便。

安装镜像

参照docker 安装ubuntu安装镜像

Spring Boot 集成RabbitMQ_第1张图片

Spring Boot 集成RabbitMQ_第2张图片

启动镜像

docker run -d -p 15672:15672 -p 5672:5672 rabbitmq:3-management

这里写图片描述

这里要映射2个端口:15672是Web管理界面的端口;5672是MQ访问的端口。

Web管理界面

http://192.168.99.100:15672/

guest/guest

Spring Boot 集成RabbitMQ_第3张图片

Spring Boot 集成RabbitMQ_第4张图片

RabbitMQ服务部署好了。。。

集成

环境

IntelliJ IDEA 2016.3.4

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>1.5.1.RELEASEversion>
    parent>
        <java.version>1.8java.version>

maven依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-amqpartifactId>
        dependency>
    dependencies>

代码实现

配置

Spring Boot 集成RabbitMQ_第5张图片

AmqpInitConfig

@Configuration
@ConditionalOnProperty(prefix = "spring.rabbitmq",name = "enable", matchIfMissing = false)
public class AmqpInitConfig {

    final static String queueName="spring.boot";

    @Bean
    public Queue queue(){
        return new Queue(queueName,false);
    }

    @Bean
    public TopicExchange exchange(){
        return new TopicExchange("spring.boot.exchange");
    }

    @Bean
    public Binding binding(TopicExchange exchange,Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with(queueName+".key");
    }

    @Bean
    public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter){
        SimpleMessageListenerContainer container=new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setMessageListener(listenerAdapter);
        container.addQueueNames(queueName);
        return container;
    }

    @Bean
    public MessageListenerAdapter listenerAdapter(Receiver receiver){
        return new MessageListenerAdapter(receiver,"receiveMessage");
    }
}

接受消息

Receiver

@Component
public class Receiver {
    CountDownLatch latch = new CountDownLatch(1);

    public void receiveMessage(String message) {
        System.out.println("Received <" + message + ">");
        latch.countDown();
    }

    public CountDownLatch getLatch() {
        return latch;
    }
}

发送消息

Runner

@Component
public class Runner implements CommandLineRunner {
    private final RabbitTemplate rabbitTemplate;
    private final Receiver receiver;
    private final ConfigurableApplicationContext context;

    public Runner(Receiver receiver, RabbitTemplate rabbitTemplate,
                  ConfigurableApplicationContext context) {
        this.receiver = receiver;
        this.rabbitTemplate = rabbitTemplate;
        this.context = context;
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Sending message...");
        rabbitTemplate.convertAndSend("spring.boot.exchange","spring.boot.key", "Hello from RabbitMQ!");
        receiver.getLatch().await(  10000, TimeUnit.MILLISECONDS);
        context.close();
    }

}

启动

AmqpApplication

@SpringBootApplication
@ComponentScan(basePackages = "com.wxs.amqp")
public class AmqpApplication {
    public static void main(String[] args) {
        SpringApplication.run(AmqpApplication.class,args);
    }
}

Spring Boot 集成RabbitMQ_第6张图片

踩过的坑

坑一

发送消息需要制定exchange,如果不指定,不会发送消息。

Spring Boot 集成RabbitMQ_第7张图片

坑二

跨局域网访问MQ。需要把虚拟机的网络改为桥接网络。

Spring Boot 集成RabbitMQ_第8张图片

打卡虚拟机终端,ifconfig eth0查看IP

Spring Boot 集成RabbitMQ_第9张图片

192.168.99.100172.16.36.81

参考

Messaging with RabbitMQ
How to use this image Running the daemon

你可能感兴趣的:(Spring,Boot,MQ)