Spring Boot 集成RabbitMQ

来源:互联网 发布:怎样注销手机淘宝账号 编辑:程序博客网 时间:2024/04/30 11:12

RabbitMQ is an open source multi-protocol messaging broker.

前言

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

搭建RabbitMQ服务

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

安装镜像

参照docker 安装ubuntu安装镜像

这里写图片描述

这里写图片描述

启动镜像

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

这里写图片描述

这里写图片描述

RabbitMQ服务部署好了。。。

集成

环境

IntelliJ IDEA 2016.3.4

    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.1.RELEASE</version>    </parent>
        <java.version>1.8</java.version>

maven依赖

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

代码实现

配置

这里写图片描述

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

@Componentpublic 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

@Componentpublic 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);    }}

这里写图片描述

踩过的坑

坑一

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

这里写图片描述

参考

Messaging with RabbitMQ
How to use this image Running the daemon

原创粉丝点击