• rabbitmq消息模式Fanout 模式


    Fanout——发布订阅模式,是一种广播机制。
    
    此模式包括:一个生产者、一个交换机 (exchange)、多个队列、多个消费者。生产者将消息发送到交换机,交换机不存储消息,将消息存储到队列,消费者从队列中取消息。如果生产者将消息发送到没有绑定队列的交换机上,消息将丢失。
    
    用 Java demo 实现此模式
    package com.tszr.fanout;
    
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class Productor {
        private static final String EXCHANGE_NAME = "fanout_exchange";
    
        public static void main(String[] args){
            // 1、创建连接工程
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("127.0.0.1");
            factory.setUsername("guest");
            factory.setPassword("guest");
            factory.setVirtualHost("/");
    
            Connection connection = null;
            Channel channel = null;
            try {
                // 2、获取连接、通道
                connection = factory.newConnection();
                channel = connection.createChannel();
                // 消息内容
                String message = "hello fanout mode";
                // 指定路由key
                String routeKey = "";
                String type = "fanout";
                // 3、声明交换机
                channel.exchangeDeclare(EXCHANGE_NAME, type);
                // 4、声明队列
                channel.queueDeclare("queue1", false, false, false, null);
                channel.queueDeclare("queue2", false, false, false, null);
                channel.queueDeclare("queue3", false, false, false, null);
                channel.queueDeclare("queue4", false, false, false, null);
                // 5、绑定 channel 与 queue
                channel.queueBind("queue1", EXCHANGE_NAME, routeKey);
                channel.queueBind("queue2", EXCHANGE_NAME, routeKey);
                channel.queueBind("queue3", EXCHANGE_NAME, routeKey);
                channel.queueBind("queue4", EXCHANGE_NAME, routeKey);
                // 6、发布消息
                channel.basicPublish(EXCHANGE_NAME, routeKey, null, message.getBytes("UTF-8"));
                System.out.println("消息发送成功!");
            } catch (IOException | TimeoutException e) {
                e.printStackTrace();
                System.out.println("消息发送异常");
            }finally {
                // 关闭通道
                if (channel != null && channel.isOpen()) {
                    try {
                        channel.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                // 关闭连接
                if (connection != null && connection.isOpen()) {
                    try {
                        connection.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    package com.tszr.fanout;
    
    import com.rabbitmq.client.*;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class Customer {
        private static Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 创建连接工厂
                ConnectionFactory factory = new ConnectionFactory();
                factory.setHost("127.0.0.1");
                factory.setUsername("guest");
                factory.setPassword("guest");
                factory.setVirtualHost("/");
    
                final String queueName = Thread.currentThread().getName();
                Connection connection = null;
                Channel channel = null;
                try {
                    // 获取连接、通道
                    connection = factory.newConnection();
                    channel = connection.createChannel();
    
                    Channel finalChannel = channel;
                    finalChannel.basicConsume(queueName, true, new DeliverCallback() {
                        @Override
                        public void handle(String consumerTag, Delivery delivery) throws IOException {
                            System.out.println(delivery.getEnvelope().getDeliveryTag());
                            System.out.println(queueName + ":收到消息是:" + new String(delivery.getBody(), "UTF-8"));
                        }
                    }, new CancelCallback() {
                        @Override
                        public void handle(String consumerTag) throws IOException {
                        }
                    });
                    System.out.println(queueName + ":开始接收消息");
                } catch (IOException |
                        TimeoutException e) {
                    e.printStackTrace();
                } finally {
                    // 关闭通道和连接......
                }
            }
    
        };
    
        public static void main(String[] args) throws IOException, TimeoutException {
            // 创建线程分别从四个队列中获取消息
            new Thread(runnable, "queue1").start();
            new Thread(runnable, "queue2").start();
            new Thread(runnable, "queue3").start();
            new Thread(runnable, "queue4").start();
        }
    }

  • 相关阅读:
    object detection物体检测基本概念
    anaconda python环境搭建
    Eclipse环境下添加package到工程的classpath
    34-使用函数实现-文件拷贝
    33-使用函数实现-斐波那契数列
    32-简单的位置参数
    31-分段进行文件拷贝
    30-Python文件拷贝
    29-简单的文件对象基础操作
    28-石头剪刀布:三局两胜
  • 原文地址:https://www.cnblogs.com/tszr/p/16420153.html
Copyright © 2020-2023  润新知