RabbitMQ: Routing结构

生产者

java 复制代码
package com.qf.mq2302.routing;

import com.qf.mq2302.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class EmitLog {
    public static final String EXCHANGE_NAME="emitlogs";


    public static void main(String[] args) throws Exception {
        Connection connection = MQUtils.getConnection();
        Channel channel = connection.createChannel();

        //创建一个路由模式的交换机,默认创出来,不持久化,不自动删除,不是内部交换机
        channel.exchangeDeclare(EXCHANGE_NAME,"direct");

        String msg="hello routing!!";

        //准备routingKey
        String routingKey="info";

        //发送消息
        channel.basicPublish(EXCHANGE_NAME,routingKey,null,msg.getBytes("utf-8"));

        channel.close();
        connection.close();



    }








}

消费者1号

java 复制代码
package com.qf.mq2302.routing;

import com.qf.mq2302.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;

import java.io.IOException;

public class ReceiveError {
    private static final String EXCHANGE_NAME="emitlogs";

    public static void main(String[] args) throws Exception {
        Connection connection = MQUtils.getConnection();
        Channel channel = connection.createChannel();

        channel.exchangeDeclare(EXCHANGE_NAME,"direct");

        //该消费者创建一个自己独占的队列,绑定到指定交换机接收消息。
        String queueName = channel.queueDeclare().getQueue();

        //准备号要绑定时使用的routingkey
        String routingKey = "error";

        //绑定该队列到交换机
        channel.queueBind(queueName,EXCHANGE_NAME,routingKey);

        //设置预留消息队列,也就是,RabbitMQ发过来,我可以存几个。当确认一个就会又发过来一个,
        // 但是这些相当于线程池里的线程,然后每个线程又去开辟一个新的线程去执行,回调方法,
        // 当回调方法确认完事,才会释放当前这个线程,然后去队列里在消费一个过来。
        channel.basicQos(1);

        //autoAck :false不自动确认,需要手动确认,如果手动不确认,就会按照 channel.basicQos(1);的数量,给多少就消费多少,不会再给你发了。
        channel.basicConsume(queueName, false, new DeliverCallback() {
            @Override
            public void handle(String consumerTag, Delivery message) throws IOException {
                byte[] body = message.getBody();
                String msg = new String(body, "utf-8");
                System.out.println(msg);

                //手动ACK
                channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
            }
        },consumerTag -> {});



    }

}

消费者2号

java 复制代码
package com.qf.mq2302.routing;

import com.qf.mq2302.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;

import java.io.IOException;

public class ReceiveIOther {
    private static final String EXCHANGE_NAME="emitlogs";

    public static void main(String[] args) throws Exception {
        Connection connection = MQUtils.getConnection();
        Channel channel = connection.createChannel();

        channel.exchangeDeclare(EXCHANGE_NAME,"direct");

        //该消费者创建一个自己独占的队列,绑定到指定交换机接收消息。
        String queueName = channel.queueDeclare().getQueue();

        //准备号要绑定时使用的routingkey
        String routingKey1 = "error";
        String routingKey2 = "info";
        String routingKey3 = "warn";

        //绑定该队列到交换机
        channel.queueBind(queueName,EXCHANGE_NAME,routingKey1);
        channel.queueBind(queueName,EXCHANGE_NAME,routingKey2);
        channel.queueBind(queueName,EXCHANGE_NAME,routingKey3);

        channel.basicQos(1);

        channel.basicConsume(queueName, false, new DeliverCallback() {
            @Override
            public void handle(String consumerTag, Delivery message) throws IOException {
                byte[] body = message.getBody();
                //获取routingKey
                String routingKey = message.getEnvelope().getRoutingKey();
                String msg = new String(body, "utf-8");
                System.out.println(msg);

                //手动ACK
                channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
            }
        },consumerTag -> {});



    }

}
相关推荐
科技AI训练师几秒前
2026年清虹分布式坐席系统如何破局技术内卷与运维成本困局
运维·分布式
三声三视2 分钟前
Electron + 鸿蒙分布式投屏:PC 端一键推送画面到鸿蒙设备全实战
分布式·electron·harmonyos·鸿蒙·桌面
lvrongbao12 分钟前
Kafka 场景化面试题top5: 事务与分布式一致性
分布式·kafka
NOVAnet202315 分钟前
SD-WAN 在芯片跨国研发场景中的技术能力与部署实践
分布式·网络安全·sd-wan·网络服务·全球组网
zhangzeyuaaa24 分钟前
深入剖析Kafka:Offset机制的底层基石——消息有序性
分布式·kafka
隔壁阿布都39 分钟前
Kafka 核心组件及其作用(全解)
分布式·kafka
covco12 小时前
分布式架构实战:全平台矩阵管理系统的技术实现与性能优化
分布式·矩阵·架构
gQ85v10Db17 小时前
Redis分布式锁进阶第三十一篇
数据库·redis·分布式
未若君雅裁21 小时前
Redis 分布式锁与 Redisson:从抢券超卖讲到 WatchDog、可重入和 RedLock
redis·分布式
一只普通的码农21 小时前
Filebeat 在windows环境部署并结合kafka使用
分布式·kafka