美文网首页工作生活
第四章,备份交换器

第四章,备份交换器

作者: 毛仑上保罗先生 | 来源:发表于2019-07-03 11:19 被阅读0次

    如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以使用备份交换器,这样可以将未被路由的消息存储在 RabbitMQ 中,再在需要的时候去处理这些消息。

    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.MessageProperties;
    import com.sun.org.apache.bcel.internal.generic.NEW;
    
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.TimeoutException;
    
    public class AlternateExchange {
        private static final String EXCHANGE_NAME = "exchange_demo";
        private static final String BINDING_KEY = "bingkey_demo";
        private static final String QUEUE_NAME = "queue_demo";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            //设置服务器主机
            factory.setHost("127.0.0.1");
            //设置用户名
            factory.setUsername("guest");
            //设置密码
            factory.setPassword("guest");
            //创建连接
            Connection connection = factory.newConnection();
            //创建消息通道
            final Channel channel = connection.createChannel();
            //备份交换器
            Map<String, Object> arguments = new HashMap<>(16);
            arguments.put("alternate-exchange", "backup-exchange");
            channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, arguments);
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, BINDING_KEY);
    
            // 声明一个 fanout 类型的交换器,建议此处使用 fanout 类型的交换器
            channel.exchangeDeclare("backup-exchange", "fanout", true, false, null);
            // 消息没有被路由的之后存入的队列
            channel.queueDeclare("unRoutingQueue", true, false, false, null);
            channel.queueBind("unRoutingQueue", "backup-exchange", "");
    
            // 发送一条持久化消息
            String message = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 没有被正确的路由到消息队列,此时此消息会进入 unRoutingQueue";
            // 使用 routingKey
            channel.basicPublish(EXCHANGE_NAME, "not-exists-routing-key", true, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes(StandardCharsets.UTF_8));
            System.err.println("消息发送完成......");
        }
    }
    
    
    image.png
    还是应该结合管理系统一块学习, 我们在浏览器地址栏中输入 http://localhost:15672/#/queues
    就能看到自己创建过的队列啦
    image.png

    相关文章

      网友评论

        本文标题:第四章,备份交换器

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