spring boot + rabbitmq

241 阅读2分钟

前提

上周我们的项目经理破天荒的要求我把原来的项目升级下,使用消息队列处理订单,不再是在处理订单的所有逻辑都串行起来,听到这一消息,我马上紧张起来,以前一直都是串行处理的,怎么现在要用mq了,而且mq我还没用过,赶紧搜索资料学习起来,于是乎就有了这篇文章。

rabbitmq

在众多的消息队列中间件中,我选择了rabbitmq进行学习,一是由于他安装起来方便,二是有官方的spring starter,由于我初次的使用。

首先我选择了带web管理端的镜像,docker pull rabbitmq:management,

image.png

镜像拉取完后,docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management,其中端口15672为web的暴露端口。访问http://localhost:15672,username&password 为guest。

image.png

rabbitmq starer

将rabbitmq整合到spring boot中,添加依赖

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

application.yml中配置

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    virtualHost: /

RabbitmqConfig

@Configuration
public class RabbitmqConfig {
    // 声明交换机和队列
    public static final String QUEUE_HELLO = "queue_hello";
    public static final String EXCHANGE_HELLO = "exchange_hello";

    // 声明工作模式的交换机
    @Bean(EXCHANGE_HELLO)
    public Exchange EXCHANGE_TOPICS() {
        // durable(true) 表面重启之后交换机还在
        return ExchangeBuilder.directExchange(EXCHANGE_HELLO).build();
    }

    // 声明QUEUE_HELLO队列
    @Bean(QUEUE_HELLO)
    public Queue QUEUE() {
        return new Queue(QUEUE_HELLO);
    }

    // 交换机与QUEUE_HELLO队列绑定
    @Bean
    public Binding BINDING_QUEUE(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).withQueueName();
    }

}

ReceiveHandler 监听器

@Component
public class ReceiveHandler {
    // 监听队列
    @RabbitListener(queues = {RabbitmqConfig.QUEUE_HELLO})
    public void receiveMsg(String msg, Message message, Channel channel){
        System.out.println(msg);
    }
}

来到web端进行消息的发送。点击queues,进去我们刚刚创建的队列中。

image.png

找到publish message ,在properties中填写 content-type=text/plain ,payload填写要发送到队列中的内容。 image.png

切回到idea中,我们能查看到刚刚在web端往队列里面发送的内容了。

通过java代码发送消息。

image.png 启动测试用例,就可以看到往队列发送的消息了。

rabbitmq 交换机

rabbitmq中的基本逻辑。

image.png

exchange与queue之间存在四种关系。

  • fanout fanout-exchange模式,将消息推送到所有与之绑定的queue中;
  • direct direct-exchange模式,将消息推送到与之绑定的queue中,且RoutingKey完全匹配。(默认模式)
  • topic topic-exchange模式,与direct-exchange模式相识,不过RoutingKey做模糊匹配。
  • headers headers-exchange模式,根据headers来分发消息。

以上就是rabbitmq在spring boot的基础使用了。