RabbitMQ的五种模式

一、简单模式

简单模式(Simple):一个生产者,一个消费者

java 复制代码
package com.qiangesoft.rabbitmq.mode.simple;

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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 简单模式
 * ps:一个生产者,一个消费者
 *
 * @author qiangesoft
 * @date 2024-05-08
 */
@Slf4j
@RequestMapping("/simple")
@RestController
public class SimpleMode {

    private final String QUEUE = "simple.queue";

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者
     */
    @GetMapping("/send")
    public void send(String message) {
        rabbitTemplate.convertAndSend(QUEUE, message);
    }

    /**
     * 消费者
     */
    @RabbitListener(queuesToDeclare = @Queue(name = QUEUE))
    public void receiveMessage(String message) {
        log.info("Received Message: " + message);
    }

}

二、工作模式

工作队列模式(Work Queue): 多个消费者竞争消息

java 复制代码
package com.qiangesoft.rabbitmq.mode.work;

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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 工作模式
 * ps:多个消费者竞争消息
 *
 * @author qiangesoft
 * @date 2024-05-08
 */
@Slf4j
@RequestMapping("/work")
@RestController
public class WorkMode {

    private final String QUEUE = "work.queue";

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者
     */
    @GetMapping("/send")
    public void send(String message) {
        for (int i = 0; i < 10; i++) {
            rabbitTemplate.convertAndSend(QUEUE, message + i);
        }
    }

    /**
     * 消费者1
     */
    @RabbitListener(queuesToDeclare = @Queue(name = QUEUE))
    public void receiveMessage1(String message) {
        log.info("Received Message by consumer1: " + message);
    }

    /**
     * 消费者2
     */
    @RabbitListener(queuesToDeclare = @Queue(name = QUEUE))
    public void receiveMessage2(String message) {
        log.info("Received Message by consumer2: " + message);
    }

}

三、发布订阅模式

发布/订阅模式(Publish/Subscribe):一个生产者,多个消费者

java 复制代码
package com.qiangesoft.rabbitmq.mode.pubsub;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 发布/订阅模式
 * ps:一个生产者,多个消费者
 *
 * @author qiangesoft
 * @date 2024-05-08
 */
@Slf4j
@RequestMapping("/pubsub")
@RestController
public class PubSubMode {

    private final String EXCHANGE = "fanout.exchange";

    private final String KEY = "";

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者
     */
    @GetMapping("/send")
    public void sendM(String message) {
        rabbitTemplate.convertAndSend(EXCHANGE, KEY, message);
    }

    /**
     * 消费者1
     */
    @RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.FANOUT)))
    public void receiveMessage1(String message) {
        log.info("Received Message by consumer1: " + message);
    }

    /**
     * 消费者2
     */
    @RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.FANOUT)))
    public void receiveMessage2(String message) {
        log.info("Received Message by consumer2: " + message);
    }

}

四、路由模式

路由模式(Routing):根据路由键将消息转发到对应队列

java 复制代码
package com.qiangesoft.rabbitmq.mode.routing;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 路由模式
 * ps:根据路由键将消息转发到对应队列
 *
 * @author qiangesoft
 * @date 2024-05-08
 */
@Slf4j
@RequestMapping("/routing")
@RestController
public class RoutingMode {

    private final String EXCHANGE = "direct.exchange";

    private final String KEY1 = "direct1";

    private final String KEY2 = "direct2";

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者
     */
    @GetMapping("/send")
    public void sendM(String message) {
        rabbitTemplate.convertAndSend(EXCHANGE, KEY1, message);
    }

    /**
     * 消费者
     */
    @RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.DIRECT), key = {KEY1, KEY2}))
    public void receiveMessage(String message) {
        log.info("Received Message: " + message);
    }

}

五、主题模式

通配符模式(Topics):使用通配符匹配路由键

java 复制代码
package com.qiangesoft.rabbitmq.mode.topic;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 主题模式
 * ps: 使用通配符匹配路由键
 *
 * @author qiangesoft
 * @date 2024-05-08
 */
@Slf4j
@RequestMapping("/topic")
@RestController
public class TopicMode {

    private final String EXCHANGE = "topic.exchange";

    private final String QUEUE = "topic.queue";

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者
     */
    @GetMapping("/send")
    public void send(String message) {
        rabbitTemplate.convertAndSend(EXCHANGE, QUEUE, message);
    }

    /**
     * 消费者
     */
    @RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.TOPIC), key = {"topic.*", "#.topic"}))
    public void receiveMessage(String message) {
        log.info("Received Message: " + message);
    }

}
相关推荐
山甫aa15 小时前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web
严肃小白兔1 天前
Cloudflare Durable Objects 支持自动重试:分布式调用如何避免重复执行?
分布式
Pniubi1 天前
基于RabbitMQ实现延迟队列
rabbitmq
方方洛2 天前
ray教程-27-附录F-RayClient与runtime_env与多语言
人工智能·分布式·机器学习
方方洛2 天前
ray教程-25-附录E-端到端实战案例
人工智能·分布式·机器学习
一条泥憨鱼3 天前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
迅翼SwiftWing4 天前
编队系列(二)|固定翼如何依靠邻居信息保持队形?一致性控制、通信拓扑与分布式仿真实现,附仿真代码
分布式
ly76894 天前
幂等消费者与重试副作用:Kafka 端点接入时的去重边界
分布式·kafka·linq·apache camel·幂等消费者·重试副作用·去重边界
qq_452396234 天前
第三篇:《从 ZooKeeper 到 KRaft 的迁移实战:前置条件、三阶段流程与回滚策略》
分布式·zookeeper·云原生
真上帝的左手4 天前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis