RabbitMQ知识点整理9-exchangeBind方法详解

我们不仅可以将交换器与队列绑定,也可以将交换器与交换器绑定,后者和前者 RabbitMQ知识点整理8-queueBind方法详解 的用法如出一辙,相应的方法如下:

1.Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;
2.Exchange.BindOk exchangeBind(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException;
3.void exchangeBindNoWait(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException;

方法中的参数可以参考 RabbitMQ知识点整理6-exchangeDeclare方法详解 , 绑定之后,消息从source 交换器转发到 destination 交换器, 某种程度上来说destination 交换器可以看作一个队列

package demo.java.web.amqp.rabbitmq.demo2;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import org.junit.Test;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 交换器与交换器绑定
 * 
 * @author jiangkd
 * @date 2020/10/12
 */
public class ExchangeBindDemo {

    final private String IP_ADDRESS = "127.0.0.1";
    final private int PORT = 5672;
    final private String USERNAME = "root";
    final private String PASSWORD = "root123";
    final private String VIRTUALHOST = "/jiangkd";

    @Test
    public void exchangeBind() throws IOException, TimeoutException {
        //
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(IP_ADDRESS);
        factory.setPort(PORT);
        factory.setVirtualHost(VIRTUALHOST);
        factory.setUsername(USERNAME);
        factory.setPassword(PASSWORD);

        // 创建连接
        Connection connection = factory.newConnection();

        // 创建信道
        Channel channel = connection.createChannel();

        // 定义交换器source和destination, 类型分别是direct和fanout
        channel.exchangeDeclare("source", "direct", true, false, null);
        channel.exchangeDeclare("destination", "fanout", true, false, null);
        // 绑定交换器, 绑定键是 exKey
        channel.exchangeBind("destination", "source", "exKey");
        // 定义队列
        channel.queueDeclare("queue", true, false, false, null);
        // 绑定交换器和队列, 这个交换器类型是fanout, 不用指定路由键, 消息会发送到与此交换器绑定的所有队列
        channel.queueBind("queue", "destination", "");

        // 发布消息
        channel.basicPublish("source", "exKey", null, "Hello World!".getBytes());
    }
}

生产者发送消息至交换器source 中,交换器source 根据路由键找到与其匹配的另一个交换器destination , 井把消息转发到destination 中, 进而存储在.destination 绑定的队列queue 中,参考图3-1

 

posted @ 2020-10-12 16:46  KILLNPE  阅读(1147)  评论(0编辑  收藏  举报