RabbitMQ学习(七)—主题模式及work模式的入门案例

本文介绍了RabbitMQ中的话题模式和工作模式。在主题模式中,生产者使用不同的路由键发送消息,消费者根据匹配规则接收消息。在轮询分发的工作模式中,消息均匀地分发给多个消费者,而公平分发则允许消费者主动拉取并确认消息,实现能者多劳的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、主题模式—>topic

主题模式与路由模式相似,但是,主题模式是一种模糊的匹配方式。交换机为topic模式,路由key可选 *(匹配明确的一个单词) 或 #(匹配0到多个单词).其路由的*和#类似于数据库中的模糊匹配。设置模糊的绑定方式,“*”操作符将“.”视为分隔符,匹配单个字符;“#”操作符没有分块的概念,它将任意“.”均视为关键字的匹配部分,能够匹配多个字符。 比如路由key为*.s.*只能接收com.s.com这样形式的队列消息,*是指有且只能有一个;#.s.#可以接收com.s.som、s.com、com.s、s、com.com.s.com.com等。

主题模式的生产者代码如下:

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        //所有的中间件技术都是基于tcp/ip协议基础之上构建新的协议规范,只不过rabbitmq遵循的是amqp
        //1.创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("ip");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            //创建连接Connection
            connection = connectionFactory.newConnection("生产者");
            //通过连接获取通道Channel
            channel = connection.createChannel();
            //创建交换机
            String exchangeName = "direct_msg_topic";
            //设置交换机类型
            String exchangeType = "topic";
            //声明交换机  参数1:交换机名字 参数2:交换机类型 参数3:交换机是否持久化
            channel.exchangeDeclare(exchangeName, exchangeType, true);
            //声明队列名字
            String queueName1 = "queue4";
            String queueName2 = "queue5";
            String queueName3 = "queue6";
            /*
             *创建队列
             *参数1:  队列名称 如果队列不存在自动创建
             *参数2:  用来定义队列特性是否要持久化 true 持久化队列   false 不持久化(服务重启后队列还保存,但不保存消息)
             *参数3:  exclusive 是否独占队列  true 独占队列   false  不独占
             *参数4:  autoDelete: 是否在消费完成后自动删除队列  true 自动删除  false 不自动删除
             *参数5:  额外附加参数
             */
            channel.queueDeclare(queueName1, true, false, false, null);
            channel.queueDeclare(queueName2, true, false, false, null);
            channel.queueDeclare(queueName3, true, false, false, null);
            //绑定队列和交换机 参数1:队列名字 参数2:交换机名字 参数3:路由key
            channel.queueBind(queueName1, exchangeName, "*.s.*");
            channel.queueBind(queueName2, exchangeName, "#.s.#");
            channel.queueBind(queueName3, exchangeName, "*.s");
            Scanner sc = new Scanner(System.in);

                //准备消息内容
               String message ="hello,s2";
                //发送消息给队列queue
                channel.basicPublish(exchangeName, "com.s.rabbitmq", null, message.getBytes());
                System.out.println("发送成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            //7.关闭连接
//            if (channel!=null&&channel.isOpen()){
//                channel.close();
//         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值