RabbitMQ广播模式(动态生成queue)

RabbitMQ的广播机制和ActiveMQ有所不同。
先来梳理下RabbitMQ中消息从产生到消费的流程吧:
在这里插入图片描述
而exchange 存在多种类型,这里就只说广播模式(fanout)了。在广播模式中,一个exchange对应多个queue,会向每个queue都发送信息,然后不同的queue再由其对应的消费者消费信息,即完成了广播。
因为广播模式中不关注routingkey和queue,只需要queue的queue name唯一即可,所以这里把routingkey移出来了,实际上还是会经过的哦。

在这里插入图片描述

1.新建一个spring boot 项目并引入官方的amqp包

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

2.添加RabbitMQ连接参数

spring.rabbitmq.host=xx
spring.rabbitmq.port=5672
spring.rabbitmq.username=xx
spring.rabbitmq.password=xx

3.创建生产者

同时添加一个配置参数rabbit.exchange,用来动态指定exchange(比如使用apollo或者spring cloud config)
增加配置参数

rabbit.exchange=testExchange

增加生产者

@Component
public class Producer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Value("${rabbit.exchange}")
    private String exchange;

    public void sendInfo(){
        Message message = new Message("123".getBytes(),new MessageProperties());
        rabbitTemplate.send(exchange,"",message);
    }
}

4.动态创建queue和消费者

因为需要执行createQueue方法才能生成一个queue和消费者,所以这里先用@Component指定扫描当前类,再用@PostConstruct指定扫描时执行该方法。
因为创建的queue是临时queue,当消费者消失时,该queue就会自动删除,因为创建queue也是由rabbitMQ自行生成的,所以queue name一定是唯一的。这样在集群部署时,就可以做到即开即用了,就算关闭了服务,对应的queue也会自动消失。

@Component
public class Consumer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Value("${rabbit.exchange}")
    private String exchange;

    @PostConstruct
    public void createQueue(){
        Channel channel = rabbitTemplate.getConnectionFactory().createConnection().createChannel(true);

        try{
            /**
             * 与生产者使用同一个交换机
             */
            channel.exchangeDeclare(exchange, "fanout",true);
            /**
             * 获取一个随机的队列名称,使用默认方式,产生的队列为临时队列,在没有消费者时将会自动删除
             */
            String queueName = channel.queueDeclare().getQueue();

            /**
             * 关联 exchange 和 queue ,因为是广播无需指定routekey,routingKey设置为空字符串
             */
            // channel.queueBind(queue, exchange, routingKey)
            channel.queueBind(queueName, exchange, "");

            com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope,
                                           AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message = new String(body, "UTF-8");

                    if(StringUtils.isEmpty(message)){
                        return;
                    }

                    /**
                     * 对信息做操作
                     */
                }

            };
            //true 自动回复ack
            channel.basicConsume(queueName, true, consumer);
        }catch (Exception ex){
        }
    }
}

5.手动在RabbitMQ控制界面创建exchange

如下图选择广播模式,并且为永久exchange,如果要设置临时exchange的话要修改4中的如下语句最后一个参数为false

channel.exchangeDeclare(exchange, "fanout",true);

在这里插入图片描述

6.启动项目,测试

Consumer中打个断点,就能看到在启动时调用createQueue后所产生的队列名
在这里插入图片描述
到RabbitMQ控制台上搜索下,确实存在
在这里插入图片描述
点开看下对应的exchange
在这里插入图片描述
完全OK,发送条信息试下,也能够接收到
在这里插入图片描述
在这里插入图片描述
可以试下再重复第4步,再建一个queue,或者再起一个项目,你会发现两个消费者都能接收到信息。

然后我们把项目关闭,看看queue还在不在,明显已经木有了。
在这里插入图片描述

<think>好的,我现在需要帮助用户寻找RabbitMQ工作模式的示例代码或教程。首先,我得回顾用户提供的引用内容,看看里面有没有相关的信息。 用户提到了四个引用,其中引用[1]和引用[2]是关于官网教程和Spring集成示例的。引用[1]中的官网教程提到了“Hello World”示例,这应该是最基础的工作模式,也就是简单队列。引用[2]中的SpringRabbitListener类可能涉及Spring Boot整合RabbitMQ的示例代码,可能对应工作模式中的发布订阅或者路由模式。 接下来,用户需要的是工作模式的示例代码和教程。RabbitMQ常见的工作模式包括简单队列、工作队列、发布/订阅、路由、主题和RPC模式。根据用户提供的引用,我需要从这些引用中提取相关的示例。 引用[3]提到了设置队列的durable属性为true,这通常用于工作队列模式中的消息持久化,确保消息不丢失。因此,工作队列模式的示例可能在这里。而引用[4]关于Java客户端库获取监控数据,可能和具体的工作模式示例关系不大,但可以暂时忽略,除非用户需要监控相关的代码。 现在需要将不同的工作模式对应到引用中的示例。例如,简单队列对应官网的“Hello World”教程,工作队列对应设置durable队列的部分,发布订阅可能需要使用到Exchange,比如Fanout类型。而路由和主题模式则需要使用Direct或Topic类型的Exchange,这些可能在引用中没有明确提到,但用户可能需要更全面的示例,可能需要结合Spring的代码。 另外,用户提供的引用[2]提到了SpringRabbitListener,可能使用了@RabbitListener注解,这在Spring Boot中常用于监听队列,适用于各种工作模式。因此,结合Spring Boot的示例代码可能更有帮助。 接下来,我需要整理这些信息,给出每种工作模式的简要说明、示例代码和引用来源。需要注意代码的格式是否正确,比如是否使用正确的语法,以及引用标注是否正确。例如,简单队列模式引用官网教程,工作队列引用设置durable属性的部分,发布订阅可能引用官网的其他教程,但用户提供的引用中没有,可能需要调整。 可能还需要补充一些用户未提到的模式,比如路由、主题和RPC,但用户提供的引用中没有相关信息,可能需要建议参考官网或其他资源。不过根据用户的要求,应该基于提供的引用内容来回答,所以可能只能覆盖到简单队列、工作队列和发布订阅模式。 最后,生成相关问题,比如如何保证消息不丢失,如何实现发布订阅,或者如何整合Spring Boot。需要确保问题与用户的需求相关,并且基于已有的引用内容。</think>根据引用内容和示例需求,以下是RabbitMQ工作模式的核心实现示例及教程指引: ### 一、简单队列模式(Hello World) 适用于单生产者单消费者的基础场景 ```python # 生产者(官网示例) channel.queue_declare(queue='hello') channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') # 消费者(引用[2] Spring整合) @RabbitListener(queues = "hello") public void listenWorkQueue1(String msg) { System.out.println("消费者1收到消息:" + msg); } ``` 实现要点:直接指定队列名称进行通信[^1][^2] ### 二、工作队列模式(Work Queues) 多个消费者共同处理任务,默认采用轮询分发 ```java // 声明持久化队列(引用[3]) boolean durable = true; channel.queueDeclare("task_queue", durable, false, false, null); // 公平分发设置 channel.basicQos(1); // 每次只处理一条消息 ``` 应用场景:耗时任务分发、负载均衡[^3] ### 三、发布订阅模式(Publish/Subscribe) 通过Fanout Exchange广播消息 ```python # 声明交换机 channel.exchange_declare(exchange='logs', exchange_type='fanout') # 临时队列绑定 result = channel.queue_declare(queue='', exclusive=True) channel.queue_bind(exchange='logs', queue=result.method.queue) ``` 特性:所有绑定队列都会收到消息副本[^1] ### 四、Spring Boot集成示例(引用[2]) 配置类定义队列和交换机: ```java @Bean public Queue simpleQueue() { return new Queue("simple.queue"); } @Bean public FanoutExchange fanoutExchange() { return new FanoutExchange("itcast.fanout"); } ``` 监听器实现: ```java @RabbitListener(queues = "simple.queue") public void listenWorkQueue(String msg) { System.out.println("接收到消息:【" + msg + "】"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

团子ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值