消息中间件(3)—— 交换器(Fanout、Topic)

上一篇通过代码演示了最简单的交换器--direct交换器

本篇学习一下其他的交换器(Fanout、Topic)

一、Fanout交换器

又称为广播交换器,不处理路由键。只要是绑定到该交换器上的队列都能收到这个消息,Fanout交换机转发消息是最快的

创建方式很简单,只需要指定交换器的类型即可

生产者代码如下

public class FanoutProducer {

    public final static String EXCHANGE_NAME = "fanoutLogs";

    public static void main(String[] args) throws IOException, TimeoutException {
        //创建连接连接到MabbitMQ
        ConnectionFactory factory = new ConnectionFactory();
        //设置MabbitMQ所在主机ip或者主机名
        factory.setHost("127.0.0.1");
        //创建一个连接
        Connection connection = factory.newConnection();
        //创建一个信道
        Channel channel = connection.createChannel();
        /**********指定交换器的类型是广播************/
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

        /*日志消息级别,作为路由键使用*/
        String[] routekeys = {"zc1","zc2","zc3"};
        for(int i=0;i<3;i++){
            String routekey = routekeys[i%3];//每一次发送一条消息
            // 发送的消息
            String message = "Hello World_"+(i+1);
            //参数1:exchange name
            //参数2:routing key
            channel.basicPublish(EXCHANGE_NAME,routekey,null, message.getBytes());
        }
        // 关闭信道和连接
        channel.close();
        connection.close();
    }
}

消费者

public class Consumer2 {

    public static void main(String[] argv) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");

        //打开连接和创建信道,与发送端一样
        Connection connection = factory.newConnection();
        final Channel channel = connection.createChannel();
        channel.exchangeDeclare(FanoutProducer.EXCHANGE_NAME,BuiltinExchangeType.FANOUT);
        //声明一个随机队列
        String queueName = channel.queueDeclare().getQueue();

        //设置一个不存在的路由键
        String routekey="zc";
        channel.queueBind(queueName, FanoutProducer.EXCHANGE_NAME, routekey);

        System.out.println(" [*] Waiting for messages......");

        // 创建队列消费者
        final Consumer consumerB = 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");
                //假装消费
                System.out.println( "Received ["+ envelope.getRoutingKey()+ "]"+message);
            }
        };
        channel.basicConsume(queueName, true, consumerB);
    }
}

小结:使用了FANOUT交换器,即采用了广播模式,即每一个队列都能接收到,无论队列绑定的是什么路由键。

二、Topic交换器

之前说过路由键是一个最长为255的字符串,有一个特殊符号“.”,将路由键分为几级

比如路由键   zc.car.color

同时还有两个特殊符号“*”,“#”,类似于通配符,

“*”匹配 1 个

“#”匹配一个或多个

在寻找队列时,根据匹配结果将消息发布到对应队列上,其他没什么特殊的,在声明时指定交换器的类型即可,就不展示代码了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值