RabbitMQ通讯方式第三讲:Publish/Subscribe

一.Publish/Subscribe简介:

    1.1我们还是先看官网的定义:

     In the previous tutorial we created a work queue. The assumption behind a work queue is that each task is delivered to exactly one worker. In this part we'll do something completely different -- we'll deliver a message to multiple consumers. This pattern is known as "publish/subscribe".

       在上一个教程中,我们创建了一个工作队列。工作队列背后的假设是,每个任务只交付给一个工作者。在本部分中,我们将做一些完全不同的事情——我们将向多个消费者传递消息。这种模式称为“发布/订阅”。

       在介绍中我们可以发现,这次我们将要向多个队列去发送消息,一个发送者将绑定多个队列。

二.流程图:

2.1如下是官网提供的流程图。

如图可知,一个提供者连接了两个队列。这里面我们将创建自己的交换机,在代码里将会体现这一点。

三.如何定义自定义的交换机:

3.1 :官网中对于默认交换机的简单介绍:
Nameless exchange

In previous parts of the tutorial we knew nothing about exchanges, but still were able to send messages to queues. That was possible because we were using a default exchange, which we identify by the empty string ("").

3.2:引出自定义交换机:

 在这里我们需要创建的交换机的类型是:fanout

创建的java语句:

 //3. 构建交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);

 BuiltinExchangeType.FANOUT指定了交换机的类型。

3.3:直接绑定

首先,FANOUT交换机绑定队列,是直接绑定,不需要routing key. 在下文中我们将在代码中体现。

      3.3.1什么是Fanout类型的交换机:

              Fanout类型的交换机是一种广播类型的交换机,它不需要处理路由键(RoutingKey),只是简单地将消息转发给所有绑定到该交换机的队列。这种类型的交换机非常适合于发布/订阅的场景,其中一个消息需要被多个接收者同时接收。

      3.3.2不需要routingKey的原因:

                在Fanout交换机中,交换机和队列之间的绑定不需要指定路由键,因为交换机会忽略路由键,并将消息发送给所有绑定的队列。这种机制类似于子网广播,每台子网内的主机都会收到一份复制的消息。因此,Fanout交换机的这种特性使得它在处理消息时非常快速,但需要注意的是,如果没有任何队列与交换机绑定,或者没有符合路由规则的队列,那么消息会丢失 。

四:代码实现:

      4.1在代码里面我们可以清晰地看见,交换机是自定义的。并且是一个交换机绑定多个队列。

      4.2在代码里面体现了直接绑定,是不需要的routing key

      4.3获取连接的工具类的代码在小编的RabbitMQ通讯方式第一讲:Hello World-CSDN博客  里面详细的讲述过了,在这里就不再赘述了。

 import com.hdk.utiils.RabbitMQConnectionUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import org.junit.Test;

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

public class Provider {
    public static final  String EXCHANGE_NAME="pubsub";
    public static final String QUEUE_NAME1="pub_queue1";
    public static final String QUEUE_NAME2="pub_queue2";
    @Test
    public void p() throws IOException, TimeoutException {
        Connection connection = RabbitMQConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
        channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
        channel.queueDeclare(QUEUE_NAME2,false,false,false,null);
        channel.queueBind(QUEUE_NAME1,EXCHANGE_NAME,"");
        channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"");
        channel.basicPublish(EXCHANGE_NAME,"",null,"message".getBytes());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值