第四章,备份交换器

如果既不想复杂化生产者的编程逻辑,又不想消息丢失,那么可以使用备份交换器,这样可以将未被路由的消息存储在 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 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("消息发送完成......");
    }
}

第四章,备份交换器_第1张图片
image.png

还是应该结合管理系统一块学习, 我们在浏览器地址栏中输入 http://localhost:15672/#/queues
就能看到自己创建过的队列啦
第四章,备份交换器_第2张图片
image.png

你可能感兴趣的:(第四章,备份交换器)