rabbitMQ的扇出模式(fanout发布订阅)的生产者与消费者使用案例

扇出模式 fanout 发布订阅模式
生产者

生产者发送消息到交换机(logs),控制台输入消息作为生产者的消息发送

java 复制代码
package com.esint.rabbitmq.work03;

import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.Channel;

import java.util.Scanner;

public class EmitLog {


    public static final String EXCHANGE_NAME = "logs";

    public static void main(String[] args) throws Exception {

        Channel channel = RabbitMQUtils.getChannel();

        //声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");

        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            String mes = scanner.next();
            channel.basicPublish(EXCHANGE_NAME,"",null,mes.getBytes("UTF-8"));
            System.out.println("生产者发出消息:"+mes.toString());
        }
    }
}

交换机如下:

发布者如下:

消费者

创建两个消费来同时消费生产者的发布消息。声明两个临时队列,与交换机做绑定,消费消息

消费者01
java 复制代码
package com.esint.rabbitmq.work03;


import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

/**
 * 消费者01的消息接受
 */
public class ReceiveLog01 {

    public static final String EXCHANGE_NAME = "logs";

    public static void main(String[] args) throws Exception {

        //获取信道
        Channel channel = RabbitMQUtils.getChannel();
        //声明一个交换机
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");

        /**
         *声明一个队列  队列名字随机
         * 消费者断开与队列的链接后 队列自动删除
         */
        String queue = channel.queueDeclare().getQueue();

        /**
         * 绑定交换机与队列
         * 1.队列名字
         */
        channel.queueBind(queue,EXCHANGE_NAME,"");
        System.out.println("wait print message...");

        DeliverCallback deliverCallback = (var,var2)->{
            System.out.println("01:"+new String(var2.getBody()));
        };
        channel.basicConsume(queue,true,deliverCallback, var->{});

    }
}
消费者02
java 复制代码
package com.esint.rabbitmq.work03;


import com.esint.rabbitmq.RabbitMQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

/**
 * 消费者02的消息接受
 */
public class ReceiveLog02 {

    public static final String EXCHANGE_NAME = "logs";

    public static void main(String[] args) throws Exception {

        //获取信道
        Channel channel = RabbitMQUtils.getChannel();
        //声明一个交换机
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");

        /**
         *声明一个队列  队列名字随机
         * 消费者断开与队列的链接后 队列自动删除
         */
        String queue = channel.queueDeclare().getQueue();

        /**
         * 绑定交换机与队列
         * 1.队列名字
         */
        channel.queueBind(queue,EXCHANGE_NAME,"");
        System.out.println("wait print message...");

        DeliverCallback deliverCallback = (var,var2)->{
            System.out.println("02:"+new String(var2.getBody(),"UTF-8"));
        };
        channel.basicConsume(queue,true,deliverCallback, var->{});

    }
}

两个临时队列:

运行测试生产者:

运行测试消费者:

相关推荐
BUG研究员_12 小时前
Runnable与LCEL
开发语言·人工智能·python
码农颜13 小时前
5.4.1 锁分类
java·数据库·mysql
牛艺翔14 小时前
C++基础
开发语言·c++
键盘会跳舞14 小时前
C++ :容器适配器stack源码级拆解
开发语言·c++··stack·先进后出
linux-hzh14 小时前
百日算法修炼 · Day 03
java·算法
美味蛋炒饭.14 小时前
Git 版本控制(下)
开发语言·git·学习·总结·后端开发
我星期八休息14 小时前
网络编程—网络层
开发语言·前端·网络·人工智能·智能路由器
问商十三载14 小时前
RAG 检索效果差怎么排查?2026 五层诊断法完整指南
开发语言·人工智能·windows·python·算法
不负岁月无痕14 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试
mister_guo15 小时前
Java线程池参数应该如何设置(ThreadPoolExecutor)
java