java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot RabbitMQ消息模型

SpringBoot整合RabbitMQ五种消息模型的实战教学

作者:张老师技术栈

本文详细讲解五种消息模型,包括工作队列、发布订阅、路由和主题模式,并对比它们的Exchange类型与路由方式,帮你轻松选型,搞定消息分发与复杂路由

RabbitMQ 是消息队列中的主流方案。这篇讲 SpringBoot 整合 RabbitMQ 的五种消息模型。

一、引入依赖

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

二、配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

三、工作队列模式(Work Queue)

@Configuration
public class RabbitConfig {

    public static final String QUEUE = "queue.work";

    @Bean
    public Queue workQueue() {
        return new Queue(QUEUE);
    }
}
@Service
public class WorkProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send(String message) {
        for (int i = 0; i < 10; i++) {
            rabbitTemplate.convertAndSend(RabbitConfig.QUEUE, message + ":" + i);
        }
    }
}
@Component
public class WorkConsumer1 {
    @RabbitListener(queues = RabbitConfig.QUEUE)
    public void receive(String message) {
        System.out.println("消费者1收到: " + message);
        try { Thread.sleep(1000); } catch (Exception e) {}
    }
}

四、发布订阅模式(Publish/Subscribe)

@Configuration
public class FanoutConfig {

    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("exchange.fanout");
    }

    @Bean
    public Queue queueA() { return new Queue("queue.fanout.a"); }

    @Bean
    public Queue queueB() { return new Queue("queue.fanout.b"); }

    @Bean
    public Binding bindingA() {
        return BindingBuilder.bind(queueA()).to(fanoutExchange());
    }

    @Bean
    public Binding bindingB() {
        return BindingBuilder.bind(queueB()).to(fanoutExchange());
    }
}

五、路由模式(Routing)

@Configuration
public class DirectConfig {

    public static final String QUEUE_INFO = "queue.direct.info";
    public static final String QUEUE_ERROR = "queue.direct.error";

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("exchange.direct");
    }

    @Bean
    public Queue infoQueue() { return new Queue(QUEUE_INFO); }

    @Bean
    public Queue errorQueue() { return new Queue(QUEUE_ERROR); }

    @Bean
    public Binding infoBinding() {
        return BindingBuilder.bind(infoQueue()).to(directExchange()).with("info");
    }

    @Bean
    public Binding errorBinding() {
        return BindingBuilder.bind(errorQueue()).to(directExchange()).with("error");
    }
}
@Service
public class DirectProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendError(String message) {
        // 只有 errorQueue 会收到
        rabbitTemplate.convertAndSend("exchange.direct", "error", message);
    }
}

六、主题模式(Topic)

@Configuration
public class TopicConfig {

    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange("exchange.topic");
    }

    @Bean
    public Queue orderQueue() { return new Queue("queue.topic.order"); }

    @Bean
    public Queue userQueue() { return new Queue("queue.topic.user"); }

    @Bean
    public Binding orderBinding() {
        return BindingBuilder.bind(orderQueue()).to(topicExchange())
            .with("order.*");
    }

    @Bean
    public Binding userBinding() {
        return BindingBuilder.bind(userQueue()).to(topicExchange())
            .with("user.#");
    }
}

七、五种模型对比

模型Exchange类型路由方式场景
简单/工作无(默认)直接任务分发
发布订阅Fanout广播通知所有消费者
路由Direct精确匹配按级别分发
主题Topic通配符复杂路由
RPC同步请求-响应

到此这篇关于SpringBoot整合RabbitMQ五种消息模型的实战教学的文章就介绍到这了,更多相关SpringBoot RabbitMQ消息模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文