SpringBoot整合RabbitMQ系列(一)快速开始

简介

简单地说,RabbitMQ就是一个消息中间件,负责接收消息和异步处理消息。
一条消息从生产到被消费要经历了以下几个步骤:

  1. 生产者(Producer)产生一条消息(Message),也就是客户端调用一个发送消息函数。
  2. 消息通过交换机名称找到对应的交换机(Exchange)。
  3. 交换机对到来的消息进行分发,根据路由键(Routing Key)去匹配绑定到该交换机的队列的绑定键(Binding Key),将消息转发到所有匹配的队列。
  4. 队列(Queue)接收到消息,被监听该队列的消费者(Cunsumer)消费。

最简单的消息发送消费样例

pom导入
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>
application.yml 配置
spring:
  rabbitmq:
    port: 5672        #端口号
    host: localhost   #ip地址
    username: guest   #用户名
    password: guest   #密码
创建一条队列,同时监听队列
    /**
     * 监听消息队列queue,异步消费。注意方法不能返回对象,否则会报错 Failed to send reply with payload ...
     */
    @RabbitListener(queuesToDeclare = @Queue(name = "queue"))
    public void receive(String msg) {
        log.info("接收消息:{} ", msg);
    }

创建队列需要以下几个参数:

参数 含义 默认值
name 队列名
durable 是否可持久化。可持久化的队列在RabbitMQ挂掉后,队列中未被消费的消息不会丢失。 true
exclusive 是否排他的。只有创建这条队列的的连接有权访问,连接断开后,排他队列将自动删除。 false
autoDelete 是否自动删除。当没有消费者监听这条队列时,队列会被自动删除,不管队列中是否存在未被消费的消息 false
arguments 创建队列可以附带一些参数,如消息过期时间(x-message-ttl)、成为死信队列(x-dead-letter-exchange)等等 。
向队列queue发送一条消息
    @Scheduled(fixedRate = 5000)
    public void send() {
        rabbitTemplate.convertAndSend("queue", "hello");
    }

这里开启了一个定时调度任务,每隔5秒向queue发送一条hello消息。关于SpringBoot的定时调度任务,可以参考这篇文章
有几点要说明的是:

  1. 当不传exchange时,是通过Default Exchange去找到对应的队列的,Default Exchange自动绑定所有的队列,并且Routing Key等于队列名。
  2. 如果没有消费者去消费的话,消息会堆积在队列中,为准备(ready)状态。
  3. 如果队列名没有找到,则消息无法成功送达,会直接丢失。
  4. 消费时报错异常,默认的策略是重新返回队列中。
控制台输出
2019-10-29 10:31:11.650  INFO 996 --- [cTaskExecutor-1] o.j.demo.rabbitmq.RabbitmqApplication    : 接收消息:hello 
2019-10-29 10:31:16.650  INFO 996 --- [cTaskExecutor-1] o.j.demo.rabbitmq.RabbitmqApplication    : 接收消息:hello 
2019-10-29 10:31:21.650  INFO 996 --- [cTaskExecutor-1] o.j.demo.rabbitmq.RabbitmqApplication    : 接收消息:hello 

接收对象

导入pom
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>
序列化以及反序列化
    @RabbitListener(queuesToDeclare = @Queue(name = "queue.obj"))
    public void receiveObj(String msg) {
        User user = JSONObject.parseObject(msg, User.class);
        log.info("接收对象:{} ", user);
    }

    @Scheduled(fixedRate = 5000)
    public void sendObj() {
        rabbitTemplate.convertAndSend("queue.obj", JSONObject.toJSONString(new User(1, "name")));
    }


    @Data
    @AllArgsConstructor
    public static class User {
        private Integer id;
        private String name;
    }

直接用Fastjson进行序列化和反序列化即可。这种方法不需要修改rabbitTemplate默认的序列化配置,简单又快捷。

全部代码演示

package org.jiangzhe.demo.rabbitmq;

import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

@Slf4j
@EnableScheduling
@SpringBootApplication
public class RabbitmqApplication {

    @Autowired
    RabbitTemplate rabbitTemplate;

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqApplication.class, args);
    }


    @RabbitListener(queuesToDeclare = @Queue(name = "queue"))
    public void receiveString(String msg) {
        log.info("接收消息:{} ", msg);
    }

    @RabbitListener(queuesToDeclare = @Queue(name = "queue.obj"))
    public void receiveObj(String msg) {
        User user = JSONObject.parseObject(msg, User.class);
        log.info("接收对象:{} ", user);
    }

    @Scheduled(fixedRate = 5000)
    public void send() {
        rabbitTemplate.convertAndSend("queue", "hello");
        rabbitTemplate.convertAndSend("queue.obj", JSONObject.toJSONString(new User(1, "name")));
    }
    
    @Data
    @AllArgsConstructor
    public static class User {
        private Integer id;
        private String name;
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容