ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

消息队列---RabbitMQ的学习(六)

2021-06-13 20:02:30  阅读:168  来源: 互联网

标签:topic String 队列 RabbitMQ --- connection CHANGENAME EX channel


 苦心人,天不负,卧薪尝胆,三千越甲可吞吴

Success

自述

    RabbitMQ的第五个场景------主题(topic),基于路由之上,该文章可以相对简洁,因为它是基于路由之上,实际上就是将交换机的类型进行改变。
在这里插入图片描述

Exchange类型描述

扇出(fanout):发布/订阅场景中使用,将消息无条件推送给已绑定的队列。
直接(direct):路由场景中使用,将消息推送给满足条件已绑定的队列,用于精准匹配。
主题(topic):路由场景中使用,将消息推送给满足条件已绑定的队列,用于模糊匹配。
注意:交换机类型在某个场景下都可以任意使用,不存在固定场景固定类型。

主题场景模型解析

    在发布/订阅场景下的时候,交换机设置的类型是扇出(fanout),但并没有一点灵活性,只是一味的无脑传递消息,在路由场景下的时候,交换机设置的类型是直接(direct),虽然做到了对消息的限制,但是还是存在局限性-----不能基于多个标准进行路由,所以在路由的基础之上,我们再次改变交换机的类型,实现主题场景。
                               在这里插入图片描述在这里插入图片描述

主题场景

*:星号代表一个词或一个匹配项。
#:井号代表n个匹配项。
①当为“#”符号的时候,就类似于交换机的扇出(fanout)类型。
②当为“*”符号的时候,就类似于交换机的直接(direct)类型。
③当一个路由键中满足多个类型的时候,是无法与多个类型匹配的,只会匹配第一个类型。
④路由键可以为任意字,最大长度为255个字节,当路由键不在跟符号“*”或“#”符号的话,那么它的匹配方式就会和路由完全一致。

 ExSend.java

/**
 * //第五个场景:主题
 * 生产者
 */
public class ExSend {
    //exchangename
    private static final String EX_CHANGENAME = "ex_name1";

    public static void main(String[] args) {
        try {
            //1.connection
            Connection connection = ConnectionUtil.getConnection();
            //2.channel
            Channel channel = connection.createChannel();
            //3.exchange
            //paramone:exchangename
            //paramtwo:exchangetype ---->topic主题
            channel.exchangeDeclare(EX_CHANGENAME, "topic");
            //sendtype
            String[] sendtype = new String[]{"frog.consumer1", "Elephant.consumer1", "frog", "lion", "lion.consumer1", "lion.frog.Elephant.frog"};
            for (int i = 0; i < sendtype.length; i++) {
                channel.basicPublish(EX_CHANGENAME, sendtype[i], null, (sendtype[i] + "=====msg send suc").getBytes());
            }
            System.out.println("消息发送成功");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 ExRecv.java

/**
 * topic
 * 青蛙系列消费者
 */
public class ExRecv {

    //exchangename
    private static final String EX_CHANGENAME = "ex_name1";

    public static void main(String[] args) {
        try {
            //1.connection
            Connection connection = ConnectionUtil.getConnection();
            //2.channel
            Channel channel = connection.createChannel();
            //3.exchange
            //paramone:exchangename
            //paramtwo:exchangetype ---->topic主题
            channel.exchangeDeclare(EX_CHANGENAME, "topic");
            //4.queue
            String queue = channel.queueDeclare().getQueue();
            //5.binding
            channel.queueBind(queue, EX_CHANGENAME, "frog.#");
            //6.get msg
            DeliverCallback deliverCallback = new DeliverCallback() {
                @Override
                public void handle(String s, Delivery delivery) throws IOException {
                    System.out.println(new String(delivery.getBody()));
                }
            };
            //7.consumer
            channel.basicConsume(queue, true, deliverCallback, cancel -> {
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 ExRecv2.java

/**
 * topic
 * 大象系列消费者
 */
public class ExRecv2 {

    //exchangename
    private static final String EX_CHANGENAME = "ex_name1";

    public static void main(String[] args) {
        try {
            //1.connection
            Connection connection = ConnectionUtil.getConnection();
            //2.channel
            Channel channel = connection.createChannel();
            //3.exchange
            //paramone:exchangename
            //paramtwo:exchangetype ---->topic主题
            channel.exchangeDeclare(EX_CHANGENAME, "topic");
            //4.queue
            String queue = channel.queueDeclare().getQueue();
            //5.binding
            channel.queueBind(queue, EX_CHANGENAME, "Elephant.#");
            //6.get msg
            DeliverCallback deliverCallback = new DeliverCallback() {
                @Override
                public void handle(String s, Delivery delivery) throws IOException {
                    System.out.println(new String(delivery.getBody()));
                }
            };
            //7.consumer
            channel.basicConsume(queue, true, deliverCallback, cancel -> {
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 ExRecv3.java

/**
 * topic
 * 狮子系列消费者
 */
public class ExRecv3 {

    //exchangename
    private static final String EX_CHANGENAME = "ex_name1";

    public static void main(String[] args) {
        try {
            //1.connection
            Connection connection = ConnectionUtil.getConnection();
            //2.channel
            Channel channel = connection.createChannel();
            //3.exchange
            //paramone:exchangename
            //paramtwo:exchangetype ---->topic主题
            channel.exchangeDeclare(EX_CHANGENAME, "topic");
            //4.queue
            String queue = channel.queueDeclare().getQueue();
            //5.binding
            channel.queueBind(queue, EX_CHANGENAME, "lion.#");
            //6.get msg
            DeliverCallback deliverCallback = new DeliverCallback() {
                @Override
                public void handle(String s, Delivery delivery) throws IOException {
                    System.out.println(new String(delivery.getBody()));
                }
            };
            //7.consumer
            channel.basicConsume(queue, true, deliverCallback, cancel -> {
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


在这里插入图片描述
在这里插入图片描述

Ending

      加油,每天进步一点点!

标签:topic,String,队列,RabbitMQ,---,connection,CHANGENAME,EX,channel
来源: https://blog.csdn.net/qq_42618394/article/details/117884155

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有