RabbitMQ初学之一:exchange与queue的绑定

最近公司需要使用RabbitMQ,但我之前一直使用的是ActiveMQ,对RabbitMQ进行了初步的学习,但是还不系统,自己做了一些小测试,怕自己以后忘了

一. 背景

  拿到代码以后,发现,生产者在向外发送消息时,指定了exchange(交换机)和routing key,但是没有指定queue(队列)也没有将queue(队列)绑定到exchange,刚开始因为不熟悉rabbitMQ,所有不知道怎么回事,后来知道了:消费者在消费消息时,需要声明队列(队列名字随便),并将声明的队列通过routing key绑定到exchange,这样才能接收到数据,因此,生产者方需要将exchange和routing key实现告知消费者方。

二. 代码实例:生产者方指定了exchange(交换机)和routing key,但是不指定queue(队列)也不将queue(队列)绑定到exchange,队列声明和绑定队列到exchange的工作由消费者方完成

  1. 生产者方

    ① 生产者方代码

 1 import java.io.IOException;
 2 import com.rabbitmq.client.Channel;
 3 import com.rabbitmq.client.Connection;
 4 import com.rabbitmq.client.ConnectionFactory;
 5
 6 public class Producer {
 7     private final static String QUEUE_NAME = "QUEUE8";
 8
 9     public static void main(String[] args) throws IOException {
10
11         ConnectionFactory factory = new ConnectionFactory();
12         factory.setHost("localhost");
13         factory.setPort(5672);
14         factory.setUsername("guest");
15         factory.setPassword("guest");
16
17         Connection connection = factory.newConnection();
18         Channel channel = connection.createChannel();
19
20         String message = "Hello World!";
21
22         // 指定exchange和routing key,并发送消息到exchange
23         channel.basicPublish("FILETOPIC", "KEY.FILE", null, message.getBytes());
24         System.out.println(" [x] Sent ‘" + message + "‘");
25
26         channel.close();
27         connection.close();
28     }
29 }

    ② 生产者方代码运行后,可在rabbiteMQ managerment 管理界面看到相应exchange,如下图所示:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  2. 消费者方:消费者声明队列,队列名称随便起,并将该队列通过生产者指定的routing key绑定的其指定的exchange上

    ① 消费者方代码

 1 import com.rabbitmq.client.ConnectionFactory;
 2 import com.rabbitmq.client.QueueingConsumer;
 3 import com.rabbitmq.client.Channel;
 4 import com.rabbitmq.client.Connection;
 5
 6 public class Reqv {
 7
 8     private final static String QUEUE_NAME = "QUEUE8";
 9
10     public static void main(String[] argv) throws Exception {
11
12         ConnectionFactory factory = new ConnectionFactory();
13         factory.setPort(5672);
14         factory.setUsername("guest");
15         factory.setPassword("guest");
16         factory.setHost("localhost");
17
18         Connection connection = factory.newConnection();
19         Channel channel = connection.createChannel();
20
21         // 声明队列
22         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
23         System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
24
25         // 绑定队列到交换机
26         channel.queueBind(QUEUE_NAME, "FILETOPIC", "KEY.FILE");
27
28         QueueingConsumer consumer = new QueueingConsumer(channel);
29         channel.basicConsume(QUEUE_NAME, true, consumer);
30         while(true){
31             QueueingConsumer.Delivery delivery = consumer.nextDelivery();
32             String message = new String(delivery.getBody(),"UTF-8");
33             System.out.println(" 【[x] Received 】:" + message);
34         }
35     }
36 }

    ② 运行效果,消费者方代码运行后,在rabbiteMQ managerment 管理界面可以看到声明的队列,并发现该队列已经绑定到了生产者指定的exchange上

---------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------

2.

原文地址:https://www.cnblogs.com/tjudzj/p/9250440.html

时间: 2024-12-28 20:42:56

RabbitMQ初学之一:exchange与queue的绑定的相关文章

PHP操作RabbitMQ的类 exchange、queue、route kye、bind

RabbitMQ是常见的消息中间件.也许是还是不够了解的缘故,感觉功能还好吧. 讲到队列,大家脑子里第一印象是下边这样的. P生产者推送消息-->队列-->C消费者取出消息 结构很简单,但是RabbitMQ应该是为了丰富的功能吧,把“队列”拆分了. 分成了:exchange(交换机)和queue(队列)两个部分 同时说明: 生产者推送消息只推到exchange,不知道会进入哪个queue. exchange通过一个route key与queue绑定,这时才会知道消息具体落到了哪个queue里.

RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较

RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct,topic,header header模式在实际使用中较少,本文只对前三种模式进行比较. 性能排序:fanout > direct >> topic.比例大约为11:10:6 一.Direct Exchange 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定

RabbitMQ三种Exchange模式(fanout,direct,topic)的特性 -摘自网络

RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct,topic,header header模式在实际使用中较少,本文只对前三种模式进行比较. 性能排序:fanout > direct >> topic.比例大约为11:10:6 一.Direct Exchange 任何发送到Direct Exchange的消息都会被转发到RouteKey中指定

RabbitMq中的exchange是什么

在下图中的x便是exchange P是生产者,红色为queue X可以将P的task进行过滤,从而决定将task做如何处理:例如: (1),舍弃任务 (2),将任务发送到某个task (3),将任务发送到所有task exchange有4中类型:direct, topic, headers and fanout 这次主要使用fanout emit_log.py:task将被发送到exchange # -*- coding: UTF-8 -*- import pika if __name__ ==

【译】RabbitMQ:工作队列(Work Queue)

在第一篇我们写了两个程序通过一个命名的队列分别发送和接收消息.在这一篇,我们将创建一个工作队列在多个工作线程间分发耗时的工作任务. 工作队列的核心思想是避免立刻处理资源密集型任务导致必须等待其执行完成.相反的,我们安排这些任务在稍晚的时间完成.我们将一个任务封装为一个消息并把它发送到队列中.一个后台的工作线程将从队列中取出任务并最终执行.当你运行多个工作线程,这些任务将在这些工作线程间共享. 这个概念对于在一个HTTP请求中处理复杂任务的Web应用尤其有用. 准备工作 在前一篇中,我们发送了一条

RabbitMQ三种Exchange

Direct Exchange – 处理路由键.需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配.这是一个完整的匹配.如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog. Java代码   Channel channel = connection.createChannel(); channel.exchangeDeclare("exchangeName"

Python成长笔记 - 基础篇 (十二)----RabbitMQ、Redis 、线程queue

本节内容: 1.RabbitMQ 消息队列 2.Redis 3.Mysql PY 中的线程queue(threading Queue):用于多个线程之间进行数据交换,不能在进程间进行通信 进程queue:父进程与子进程中的交互,或者是同属于同一个父进程下多个子进程进行交互:两个不相关的进程间交互不能用进程queue RabbitMQ --信息流是单向的 两个完全独立的程序进行交互:1.进程间建立socket 2.一个写入disk,另一个调用 3.使用中间进程,RabbitMQ等 Remote p

rabbit exchange routing queue

转自 : https://www.xncoding.com/2017/05/13/mq/rabbitmq-tutorial04.html Direct exchange也支持同一条消息发送到多个队列中: 同时还能支持交换机使用同一个binding key来和多个队列绑定, 这时候如果某个消息的routing key一致,那么这个消息会同时发送给这几个队列. 原文地址:https://www.cnblogs.com/zhonghuahero/p/11345139.html

RabbitMQ 初学及其深入学习推荐的一些文章

记录一下学习RabbitMQ过程中,收获比较大的一些文章: 什么都别说,先把这6个Demo 玩一遍 https://www.rabbitmq.com/getstarted.html 大佬1号 https://blog.csdn.net/hzw19920329/article/category/6518862 大佬2号: https://blog.csdn.net/jiao_fuyou/article/category/2126129 大佬3号: https://blog.csdn.net/u01