RabbitMQ (四) 路由选择 (Routing)

4、发送日志(Emittinglogs)

我们准备将这种模式用于我们的日志系统。我们将消息发送到direct类型的转发器而不是fanout类型。我们将把日志的严重性作为选择键(routing key)。这样的话,接收程序可以根据严重性来选择接收。我们首先关注发送日志的代码:

像以前一样,我们需要先创建一个转发器:

channel.exchangeDeclare(EXCHANGE_NAME,“direct”);

然后我们准备发送一条消息:

channel.basicPublish(EXCHANGE_NAME,severity, null, message.getBytes());

为了简化代码,我们假定‘severity’是‘info’,‘warning’,‘error’中的一个。

5、订阅

接收消息的代码和前面的博客的中类似,只有一点不同:我们给我们所感兴趣的严重性类型的日志创建一个绑定。

StringqueueName = channel.queueDeclare().getQueue();

for(Stringseverity : argv)

{

channel.queueBind(queueName, EXCHANGE_NAME, severity);

}

6、完整的实例

发送端:EmitLogDirect.java

package com.zhy.rabbit._04_binding_key;

import java.util.Random;

import java.util.UUID;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

public class EmitLogDirect

{

private static final String EXCHANGE_NAME = “ex_logs_direct”;

private static final String[] SEVERITIES = { “info”, “warning”, “error” };

public static void main(String[] argv) throws java.io.IOException

{

// 创建连接和频道

ConnectionFactory factory = new ConnectionFactory();

factory.setHost(“localhost”);

Connection connection = factory.newConnection();

Channel channel = connection.createChannel();

// 声明转发器的类型

channel.exchangeDeclare(EXCHANGE_NAME, “direct”);

//发送6条消息

for (int i = 0; i < 6; i++)

{

String severity = getSeverity();

String message = severity + “_log :” + UUID.randomUUID().toString();

// 发布消息至转发器,指定routingkey

channel.basicPublish(EXCHANGE_NAME, severity, null, message

.getBytes());

System.out.println(" [x] Sent ‘" + message + "’");

}

channel.close();

connection.close();

}

/**

  • 随机产生一种日志类型

  • @return

*/

private static String getSeverity()

{

Random random = new Random();

int ranVal = random.nextInt(3);

return SEVERITIES[ranVal];

}

}

随机发送6条随机类型(routing key)的日志给转发器~~

接收端:ReceiveLogsDirect.java

package com.zhy.rabbit._04_binding_key;

import java.util.Random;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

import com.rabbitmq.client.QueueingConsumer;

public class ReceiveLogsDirect

{

private static final String EXCHANGE_NAME = “ex_logs_direct”;

private static final String[] SEVERITIES = { “info”, “warning”, “error” };

public static void main(String[] argv) throws java.io.IOException,

java.lang.InterruptedException

{

// 创建连接和频道

ConnectionFactory factory = new ConnectionFactory();

factory.setHost(“localhost”);

Connection connection = factory.newConnection();

Channel channel = connection.createChannel();

// 声明direct类型转发器

channel.exchangeDeclare(EXCHANGE_NAME, “direct”);

String queueName = channel.queueDeclare().getQueue();

String severity = getSeverity();

// 指定binding_key

channel.queueBind(queueName, EXCHANGE_NAME, severity);

System.out.println(" [*] Waiting for “+severity+” logs. To exit press CTRL+C");

QueueingConsumer consumer = new QueueingConsumer(channel);

channel.basicConsume(queueName, true, consumer);

while (true)

{

QueueingConsumer.Delivery delivery = consumer.nextDelivery();

String message = new String(delivery.getBody());

System.out.println(" [x] Received ‘" + message + "’");

}

}

/**

  • 随机产生一种日志类型

  • @return

*/

private static String getSeverity()

{

Random random = new Random();

int ranVal = random.nextInt(3);

return SEVERITIES[ranVal];

}

}

接收端随机设置一个日志严重级别(binding_key)。。。

最后

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

以下是今天给大家分享的一些独家干货:

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
*。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

以下是今天给大家分享的一些独家干货:

[外链图片转存中…(img-PMZDRgIh-1715590180319)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解如何配置 RabbitMQ 的队列和由(routing)吗?我可以为您提供一些基本信息。 首先,队列是消息的缓存区,用于存储等待被消费者处理的消息。在 RabbitMQ 中,可以通过 AMQP 协议定义和管理队列。 在创建队列时,您可以指定队列的名称、持久性、自动删除等属性。例如,以下是一个创建名为 "my_queue" 的持久性队列的示例: ``` channel.queueDeclare("my_queue", true, false, false, null); ``` 接下来是由(routing)。在 RabbitMQ 中,由是用于将消息从一个交换机(exchange)发送到一个或多个队列的机制。交换机可以将消息分发到多个队列,而队列则可以绑定到多个交换机。 您可以使用不同类型的交换机来实现不同的由策略。例如,使用 direct 类型的交换机可以将消息通过指定的由键(routing key)发送到与该键相匹配的队列。以下是一个使用 direct 类型交换机发送消息的示例: ``` String exchangeName = "my_exchange"; String routingKey = "my_routing_key"; String message = "Hello, RabbitMQ!"; channel.basicPublish(exchangeName, routingKey, null, message.getBytes()); ``` 以上示例将消息发送到名为 "my_exchange" 的交换机,并使用 "my_routing_key" 作为由键。接收者可以使用相同的由键将队列绑定到交换机,以便接收该消息。 希望这些信息能够帮助您了解 RabbitMQ 中队列和由的基本配置。如果您有任何其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值