RabbitMQ入门(三) —— fanout交换器

这篇文章主要介绍下fanout类型的exchange。fanout,顾名思义,就是像风扇吹面粉一样,吹得到处都是。如果使用fanout类型的exchange,那么routing key就不重要了。因为我们向exchange发送消息时用不着指定routing key,它会把消息给每个绑定到该exchange的queue发一份。

package com.jaeger.exchange.fanout;

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

import org.junit.Test;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class Producer {
	private static final String MY_EXCHANGE_NAME = "MyExchange";
	private static final String MY_ROUTING_KEY1 = "MyRoutingKey1";
	private static final String MY_QUEUE_NAME1 = "MyQueue1";
	private static final String MY_ROUTING_KEY2 = "MyRoutingKey2";
	private static final String MY_QUEUE_NAME2 = "MyQueue2";
	private static final String MY_ROUTING_KEY3 = "MyRoutingKey3";
	private static final String MY_QUEUE_NAME3 = "MyQueue3";
	private static final String FANOUT = "fanout";
	private static final String HOST = "172.19.64.21";
	private static final String USER = "jaeger";
	private static final String PASSWORD = "root";
	private static final int PORT = 5672;

	@Test
	public void createExchangeAndQueue() throws IOException, TimeoutException {
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost(HOST);
		connectionFactory.setUsername(USER);
		connectionFactory.setPassword(PASSWORD);
		connectionFactory.setPort(PORT);
		Connection connection = connectionFactory.newConnection();
		Channel channel = connection.createChannel();
		// 创建一个fanout类型的exchange
		channel.exchangeDeclare(MY_EXCHANGE_NAME, FANOUT);
		// 创建三个queue
		channel.queueDeclare(MY_QUEUE_NAME1, false, false, false, null);
		channel.queueDeclare(MY_QUEUE_NAME2, false, false, false, null);
		channel.queueDeclare(MY_QUEUE_NAME3, false, false, false, null);
		// 创建三个routing key,把exchange和queue绑定到一起
		channel.queueBind(MY_QUEUE_NAME1, MY_EXCHANGE_NAME, MY_ROUTING_KEY1);
		channel.queueBind(MY_QUEUE_NAME2, MY_EXCHANGE_NAME, MY_ROUTING_KEY2);
		channel.queueBind(MY_QUEUE_NAME3, MY_EXCHANGE_NAME, MY_ROUTING_KEY3);
		channel.close();
		connection.close();
	}

	@Test
	public void produce() throws IOException, TimeoutException {
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost(HOST);
		connectionFactory.setUsername(USER);
		connectionFactory.setPassword(PASSWORD);
		connectionFactory.setPort(PORT);
		Connection connection = connectionFactory.newConnection();
		Channel channel = connection.createChannel();
		String message = "Hello 世界!";
		/*
		向RabbitMQ发送消息。我们这里指定了exchange和routing key的名称,RabbitMQ会去找有没有叫这个名称的exchange,
		如果找到了又发现这个exchange是fanout类型,就不会再去看routing key了,而是把消息放到所有绑定到这个exchange的queue里面。
		这里我们虽然指定了一个routing key,但实际上是没有任何效果的,我们还可以用空字符串,最后消息都是到达所有queue的。
		*/
		channel.basicPublish(MY_EXCHANGE_NAME, MY_ROUTING_KEY1, null, message.getBytes("utf-8"));
		//channel.basicPublish(MY_EXCHANGE_NAME, "", null, message.getBytes("utf-8"));
		System.out.println("Sent ‘" + message + "‘");
		channel.close();
		connection.close();
	}

	@Test
	public void consume() throws IOException, TimeoutException, InterruptedException{
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost(HOST);
		connectionFactory.setUsername(USER);
		connectionFactory.setPassword(PASSWORD);
		connectionFactory.setPort(PORT);
		Connection connection = connectionFactory.newConnection();
		Channel channel = connection.createChannel();
		Consumer consumer = new DefaultConsumer(channel) {
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
					byte[] body) throws IOException {
				String message = new String(body, "UTF-8");
				System.out.println("Received ‘" + message + "‘");
			}
		};
		channel.basicConsume(MY_QUEUE_NAME1, true, consumer);
		Thread.sleep(1000);
	}
}

我们先运行createExchangeAndQueue,把三个queue绑定到一个fanout类型的exchange上:

再运行produce方法,把消息发到exchange让其转发:

我们看到虽然我们指定了一个routing key,但实际上没什么用,也可以用""代替,消息会发到每一个queue里面。

最后我们运行consume方法,让它去消费MyQueue1队列里面的消息:

可以看到MyQueue1里面的消息被消费掉了。

时间: 2024-10-13 06:07:38

RabbitMQ入门(三) —— fanout交换器的相关文章

RabbitMQ入门(二) —— direct交换器

在RabbitMQ入门(一)里我们讲到exchange有三种最主要的类型:direct.fanout和topic. 这里我们先来看看最简单的direct交换器的使用. 下面是测试代码: package com.jaeger.exchange.direct; import java.io.IOException; import java.util.concurrent.TimeoutException; import org.junit.Test; import com.rabbitmq.clie

RabbitMQ入门(四) —— topic交换器

今天我们来学习最后一个交换器类型:topic.direct是放到exchange绑定的一个queue里,fanout是放到exchange绑定的所有queue里.那有没有放到exchange绑定的一部分queue里,或者多个routing key可以路由到一个queue里呢,那就要用到topic类型的exchange. 我们先来看看多个routing key如何路由到一个queue里.假设我们有三个系统,在出错的时候会写日志,并会把日志发送到RabbitMQ,路由键为:系统名.error.在Ra

RabbitMQ学习笔记4-使用fanout交换器

fanout交换器会把发送给它的所有消息发送给绑定在它上面的队列,起到广播一样的效果. 本里使用实际业务中常见的例子, 订单系统:创建订单,然后发送一个事件消息 积分系统:发送订单的积分奖励 短信平台:发送订单的短信 消息生产者SenderWithFanoutExchange 1 package com.yzl.test3; 2 3 import java.util.Date; 4 5 import com.google.gson.Gson; 6 import com.rabbitmq.clie

RabbitMQ入门教程(三):Hello World

原文:RabbitMQ入门教程(三):Hello World 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78583480 分享一个朋友的人工智能教程(请以"右键"->"在新标签页中打开连接"的方式访问).比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. Hello World示例功能简介 功能描述

RabbitMQ入门与使用篇

介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非常的优秀.是当前最主流的消息中间件之一. RabbitMQ的官方 概念: Brocker:消息队列服务器实体. Exchange:消息交换机,指定消息按什么规则,路由到哪个队列. Queue:消息队列,每个消息都会被投入到一个或者多个队列里. Binding:绑定,它的作用是把exchange和queue按

RabbitMQ入门(一) —— 基本概念

RabbitMQ都安装了好一阵子,但一直没有时间去学习.今天正式开始进入RabbitMQ的学习,通过博文把自己的一些学习心得记录下来,以备以后查阅.由于自己也是从零开始入门,所以这里不会涉及到很深的理论知识,毕竟先要学会如何使用.关于RabbitMQ是什么,有哪些用处,大家可以自行Google. 首先,我们来看一张RabbitMQ最简单的流程图,也是我们平时使用最多的几个组件. exchange:交换器.RabbitMQ里面有很多交换器,我们也可以创建自己的交换器.当我们向RabbitMQ发送一

RabbitMQ入门:主题路由器(Topic Exchange)

上一篇博文中,我们使用direct exchange 代替了fanout exchange,这次我们来看下topic exchange. 一.Topic Exchange介绍 topic exchange和direct exchange类似,都是通过routing key和binding key进行匹配,不同的是topic exchange可以为routing key设置多重标准. direct路由器类似于sql语句中的精确查询:topic 路由器有点类似于sql语句中的模糊查询. 还记得吗?我

RabbitMq入门实战

1.依赖 <!--rabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dep 2.配置信息 #设置端口 server.port=80 #安装的RabbitMq的服务器IP spring.rabbitmq.host=192.168.***.**

2.RABBITMQ 入门 - WINDOWS - 生产和消费消息 一个完整案例

关于安装和配置,见上一篇 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置 公司有需求,要求使用winform开发这个东西(消息中间件),另外还要求开发一个日志中间件,但是也是要求做成win form的,这明显不合理,因为之前,服务器上我已经放置了一个  短信的winform的服务.那么到后期的话,登录服务器之后,全是 一个个的窗体挂在那儿,这明显合不合常理,但是领导要求这么玩,也没办法, 因为卧虎要负责的是消费 消息,所以重点说明 消费端 该案例的接收端,源自网上的代码片段