天天看点

消息队列RabbitMQ的入门使用

简单介绍消息队列

关于消息队列,学过数据结构都知道队列,而它则是基于队列实现的一个消息中间件。消息队列主要的作用是应用解耦,异步处理,流量削峰。按我的理解简单来说消息队列主要面向生产者,消费者,其中生产者只需要关注于将信息投递给消息队列,并不知道是哪个消费者或者何时进行消费,而消费者只需要关注于消息队列,从中取出消息进行消费。

RabbitMQ的简单使用

RabbitMQ是实现AMQP协议并基于erlang语言进行开发的一个开源消息队列,其中rabbitmq实现的AMQP 0-9-1模型如下图

消息队列RabbitMQ的入门使用

图来源:http://rabbitmq.mr-ping.com

生产者将消息发布给broker,也就是RabbitMQ,进入交托给Exchange(交换机),(其中有4种模式,分别是Direct,Fanout,Topic,Header,这里不详细解释了),如果是非广播模式则需要Routing key,根据routing key转发到绑定了这个Exchange并符合routing key的queue中,就是路由转发的意思。

安装

windows平台的安装:

因为RabbitMQ是基于erlang开发,所以需要配好erlang语言的环境,不然启动rabbitmq会提示需要erlang语言环境。

下载安装erlang,以管理员身份运行,然后一直next即可  http://www.erlang.org/downloads

接下来下载rabbitmq ,需要看清楚描述选择和你安装的erlang版本适配的rabbitmq版本下载

https://www.rabbitmq.com/download.html

rabbitmq提供了一个后台管理的页面,第一次使用需要配置下,进入rabbitmq的sbin目录打开命令行执行下面的命令

rabbitmq-plugins enable rabbitmq_management
           

成功则用浏览器访问localhost:15672,默认用户:guest  默认密码:guest,进去可以自己创建用户

消息队列RabbitMQ的入门使用

使用

接下来简单写个rabbitmq的小demo,用的是SpringBoot

首先是引用相关的依赖

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

然后就是关于创建队列,有两种方式,分别是动态映射,静态创建,前者是在项目中根据提供接口进行创建和配置参数,每次项目运行时会判断rabbitmq中对应的队列是否存在或者是否需要改变进行修改,后者则是在管理页面进行创建配置,个人推荐第一种,就不需要每换了一个环境就要重新配置。

需要配置yml参数详细 https://blog.csdn.net/en_joker/article/details/80103519

需要创建exchange,durable是指是否持久化,否则重启rabbitmq,队列和其消息就会丢失

@Bean("deadLetterExchange")
    public Exchange directExchange() {
        return ExchangeBuilder.directExchange("DEADLETTER_EXCHANGE").durable(true).build();
    }
           

创建队列

@Bean("redirectQueue")
    public Queue directQueue1() {
        return QueueBuilder.durable("REDIRECT_QUEUE").build();
    }
           

exchange与queue进行绑定

@Bean
    public Binding directBinding1(@Qualifier("redirectQueue") Queue queue, @Qualifier("deadLetterExchange") Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("REDIRECT_QUEUE_KEY").noargs();
    }
           

简单配置完毕启动项目,可在rabbitmq管理页面看到已创建

消息队列RabbitMQ的入门使用
消息队列RabbitMQ的入门使用

生产者发布消息 args为消息

rabbitTemplate.convertAndSend("DEADLETTER_EXCHANGE", "REDIRECT_QUEUE_KEY", args, messagePostProcessor);
           

配置消费者,只需在方法上配置@RabbitListener(queues = "REDIRECT_QUEUE")

@RabbitListener(queues = "REDIRECT_QUEUE")
    public void on(Message message, Channel channel) throws IOException {
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),true );
        System.out.println("消费者消费信息:"+new String(message.getBody()));
    }
           

但是这样配置的话只是单线程的消费者,如果想多线程消费需要配置以下工厂消费者类。

接下测试一下,成功消费。

消息队列RabbitMQ的入门使用

rabbitmq还提供确认机制,使得其过程更加可靠,确保消息的一致性。

继续阅读