美文网首页
RabbitMQ-发布订阅模式

RabbitMQ-发布订阅模式

作者: jiahzhon | 来源:发表于2020-07-20 17:35 被阅读0次
1595237710(1).jpg
  1. X:交换机、转发器
  2. 一个生产者,多个消费者
  3. 每一个消费者都有自己的队列
  4. 生产者没有直接将消息发送到队列。而是发送到了交换机
  5. 每个队列都要绑定到交换机上
  6. 生产者发送的消息,经过交换机,到达队列,就能实现一个消息被多个消费者消费
  • 生产者:
public class Send {
    private static final String EXCHANGE_NAME = "test_exchange_fanout";

    public static void main(String[] args) throws IOException {
        Connection connections = ConnectionUtils.getConnections();
        Channel channel = connections.createChannel();
        // 声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");// 分发

        String msg = "hello ps";
        channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
        System.out.println("send  " + msg);
        channel.close();
        connections.close();

    }
}
image.png

这时候消息哪去了??
消息丢失了!因为交换机没有存储能力,在rabbitMQ里面,只有队列有存储能力

  • 消费者1:
public class Recv1 {
    private static final String EXCHANGE_NAME = "test_exchange_fanout";

    private static final String QUEUE_NAME = "email_queue";

    public static void main(String[] args) throws IOException {
        Connection connections = ConnectionUtils.getConnections();
        final Channel channel = connections.createChannel();
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
        channel.basicQos(1);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                    throws IOException {
                String msg = new String(body, "utf-8");
                System.out.println("recv11   "+msg);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    channel.basicAck(envelope.getDeliveryTag(),false);
                }
            }
        };
        channel.basicConsume(QUEUE_NAME, false,defaultConsumer);
    }
}
  • 消费者2:
public class Recv2 {
    private static final String EXCHANGE_NAME = "test_exchange_fanout";

    private static final String QUEUE_NAME = "massage_queue";

    public static void main(String[] args) throws IOException {
        Connection connections = ConnectionUtils.getConnections();
        final Channel channel = connections.createChannel();
        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");
        channel.basicQos(1);
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                    throws IOException {
                String msg = new String(body, "utf-8");
                System.out.println("recv22   "+msg);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    channel.basicAck(envelope.getDeliveryTag(),false);
                }
            }
        };
        channel.basicConsume(QUEUE_NAME, false,defaultConsumer);
    }
}

相关文章

  • RabbitMQ-发布订阅模式

    X:交换机、转发器 一个生产者,多个消费者 每一个消费者都有自己的队列 生产者没有直接将消息发送到队列。而是发送到...

  • rabbitMq-发布订阅模式fanout-java

    工作原理:生产者经过交换机向队列中发送消息,交换机会把消息发送到订阅了当前消息的队列中。交换机实现的是动态的数据分...

  • 发布订阅模式(观察者模式)

    发布订阅模式(观察者模式) 发布订阅也叫观察者模式 发布 && 订阅 使用

  • 设计模式之发布订阅模式(1) 一文搞懂发布订阅模式

    目录 发布/订阅者模式的优点 实现发布/订阅者模式需要考虑的点 何时应使用发布/订阅者模式 发布/订阅者模式与观察...

  • JS-简单实现发布订阅模式

    发布订阅模式主要涉及三个对象:发布者、订阅者、主题对象。 发布-订阅模式 定义  发布-订阅模式又称观察者模式,它...

  • 从发布-订阅模式到消息队列

    发布-订阅模式 发布-订阅模式又称为观察者模式(网上也有很多说这两种模式区别,个人觉得区别不大),在发布-订阅模式...

  • MQTT 5.0 - 发布订阅模式介绍

    MQTT 协议的核心在于发布订阅模式,在本文中,我们将对这一模式进行深入的介绍。 发布订阅模式 发布订阅模式区别于...

  • Redis发布订阅模式

    Redis支持发布订阅模式,先了解一下与发布订阅相关的命令。 发布订阅模式命令 SUBSCRIBE命令用于订阅ch...

  • MQTT 发布/订阅模式介绍

    MQTT 发布/订阅模式 发布订阅模式(Publish-Subscribe Pattern)是一种消息传递模式,它...

  • 观察者模式&&订阅发布模式

    观察者模式&&订阅发布模式 参考:知乎-观察者模式 vs 发布订阅模式[https://zhuanlan.zhih...

网友评论

      本文标题:RabbitMQ-发布订阅模式

      本文链接:https://www.haomeiwen.com/subject/sfmykktx.html