rabbitmq+topic+java_译:5.RabbitMQ Java Client 之 Topics (主题)

我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换),并且有可能选择性地接收日志。

虽然使用direct(直接交换)改进了我们的系统,但它仍然有局限性 - 它不能基于多个标准进行路由。

在我们的日志系统中,我们可能不仅要根据严重性订阅日志,还要根据发出日志的源来订阅日志。您可能从syslogunix工具中了解这个概念,该工具根据严重性(info / warn / crit ...)和facility(auth / cron / kern ...)来路由日志。

这会给我们带来很大的灵活性 - 我们可能想听听来自'cron'的关键错误以及来自'kern'的所有日志。

要在我们的日志系统中实现这一点,我们需要了解更复杂的topic (主题交换)。

Topic exchange 主题交换

发送到主题交换的消息不能具有任意routing_key- 它必须是由点分隔的单词列表。单词可以是任何内容,但通常它们指定与消息相关的一些功能。一些有效的路由密钥示例:“stock.usd.nyse”,“nyse.vmw”,“quick.orange.rabbit”。路由密钥中可以包含任意数量的单词,最多可达255个字节。

绑定密钥也必须采用相同的形式。主题交换背后的逻辑类似于直接交换- 使用特定路由密钥发送的消息将被传递到与匹配绑定密钥绑定的所有队列。但是,绑定键有两个重要的特殊情况:

*(星号)可以替代一个单词。

#(hash)可以替换零个或多个单词。

在一个例子中解释这个是最容易的:

be3e3aab15b07949c2704f7e995f78ac.png

在这个例子中,我们将发送所有描述动物的消息。消息将与包含三个单词(两个点)的路由键一起发送。

路由键中的第一个单词将描述速度,第二个是颜色,第三个是物种:“。。”。

我们创建了三个绑定:Q1绑定了绑定键“* .orange。*”,Q2绑定了“*。*。rabbit”和“lazy。#”。

这些绑定可以概括为:

Q1对所有橙色动物感兴趣。

Q2希望听到关于兔子的一切,以及关于懒惰动物的一切。

路由密钥设置为“quick.orange.rabbit”的消息将传递到两个队列。消息“lazy.orange.elephant”也将同时发送给他们。另一方面,“quick.orange.fox”只会进入第一个队列,而“lazy.brown.fox”只会进入第二个队列。“lazy.pink.rabbit”将仅传递到第二个队列一次,即使它匹配两个绑定。“quick.brown.fox”与任何绑定都不匹配,因此它将被丢弃。

如果我们违反合同并发送带有一个或四个单词的消息,例如“orange”或“quick.orange.male.rabbit”,会发生什么?好吧,这些消息将不匹配任何绑定,将丢失。

另一方面,“lazy.orange.male.rabbit”,即使它有四个单词,也会匹配最后一个绑定,并将被传递到第二个队列。

主题交流

主题交换功能强大,可以像其他交易所一样。

当队列与“#”(哈希)绑定密钥绑定时 - 它将接收所有消息,而不管路由密钥 - 如扇出交换。

当特殊字符“*”(星号)和“#”(哈希)未在绑定中使用时,主题交换的行为就像直接交换一样

把它们放在一起

我们将在日志记录系统中使用主题交换。我们将首先假设日志的路由键有两个词:“。”。

EmitLogTopic.java

importcom.rabbitmq.client.BuiltinExchangeType;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.ConnectionFactory;public classEmitLogTopic {private static final String EXCHANGE_NAME = "topic_logs";public static voidmain(String[] argv) {

Connection connection= null;

Channel channel= null;try{

ConnectionFactory factory= newConnectionFactory();

factory.setHost("localhost");

connection=factory.newConnection();

channel=connection.createChannel();

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);

String routingKey=getRouting(argv);

String message=getMessage(argv);

channel.basicPublish(EXCHANGE_NAME, routingKey,null, message.getBytes("UTF-8"));

System.out.println(" [x] Sent '" + routingKey + "':'" + message + "'");

}catch(Exception e) {

e.printStackTrace();

}finally{if (connection != null) {try{

connection.close();

}catch(Exception ignore) {

}

}

}

}private staticString getRouting(String[] strings) {if (strings.length < 1)return "anonymous.info";return strings[0];

}private staticString getMessage(String[] strings) {if (strings.length < 2)return "Hello World!";return joinStrings(strings, " ", 1);

}private static String joinStrings(String[] strings, String delimiter, intstartIndex) {int length =strings.length;if (length == 0)return "";if (length

StringBuilder words= newStringBuilder(strings[startIndex]);for (int i = startIndex + 1; i < length; i++) {

words.append(delimiter).append(strings[i]);

}returnwords.toString();

}

}

ReceiveLogsTopic.java

importjava.io.IOException;importcom.rabbitmq.client.AMQP;importcom.rabbitmq.client.BuiltinExchangeType;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importcom.rabbitmq.client.ConnectionFactory;importcom.rabbitmq.client.Consumer;importcom.rabbitmq.client.DefaultConsumer;importcom.rabbitmq.client.Envelope;public classReceiveLogsTopic {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] argv) throwsException {

ConnectionFactory factory= newConnectionFactory();

factory.setHost("localhost");

Connection connection=factory.newConnection();

Channel channel=connection.createChannel();

channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);

String queueName=channel.queueDeclare().getQueue();if (argv.length < 1) {

System.err.println("Usage: ReceiveLogsTopic [binding_key]...");

System.exit(1);

}for(String bindingKey : argv) {

channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);

}

System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

Consumer consumer= newDefaultConsumer(channel) {

@Overridepublic voidhandleDelivery(String consumerTag, Envelope envelope,

AMQP.BasicProperties properties,byte[] body) throwsIOException {

String message= new String(body, "UTF-8");

System.out.println(" [x] Received '" + envelope.getRoutingKey() + "':'" + message + "'");

}

};

channel.basicConsume(queueName,true, consumer);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java某个时间推迟60天_java计算两个时间相差(天、小时、分钟、秒)

public static long dateDiff(String startTime, String endTime,String format, String str) {// 按照传入的格式生成一个simpledateformate对象SimpleDateFormat sd new SimpleDateFormat(format);long nd 1000 * 24 * 60 * 60;// 一天的毫秒数long nh 1000 * 60 * 60;// …

java影碟租赁系统_java影碟管理系统

在学习基于javaweb的影碟管理系统项目的时候&#xff0c;方便日后能及时查阅&#xff0c;在本平台中记录一下基于javaweb的影碟管理系统的开发流程。在学习时候的选用了SSM(MYECLIPSE),这个框架不论是学习还是使用都非常方便&#xff0c;简单易上手。基于javaweb的影碟管理系统…

hasp 加密 java_加密软件HASP的使用说明

加密软件hasp使用说明1.hasp环境的搭建hasp环境的搭建要根据机器的环境来安装&#xff0c;①windows系统的就安装windows版本&#xff0c;安装步骤可以参考&#xff1c;录像&#xff1e;文件下里的hasp5.0系统安装.exe&#xff1b;②linux版本的需要安装linux版本&#xff0c;安…

java明文发送_使用java MD5加密网络明文

1.[代码][Java]代码import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** Created by liuhj on 2015/11/27.*/public class MD5 {public static void main(String args[]){StringMD5("123456");}public static String StringMD5(…

php设置session 生命周期,设置session的生命周期(php)

PHP中&#xff0c;Session变量保存在服务器端(默认以文件格式保存)&#xff0c;而Session ID以cookie形式保存在客户端。销毁session的方法有2种第一种是通过程序session_destory()方法清除所有sessionunset(session[x])来清除指定的session[x]。第二种是通过关闭浏览器关闭后会…

php 查找无限级,Ztree + PHP 无限级节点 递归查找节点法

一、前言简单的描述一下&#xff0c;实习几个原理&#xff0c;思想&#xff0c;其实写很多东西&#xff0c;思想算是最重要的。1、目标&#xff1a;将写一个无限节点的树形目录结构&#xff0c;如下图步骤&#xff1a;1、你的下载 插件 ztree。然后布置在你的项目中。2、相关C…

用php实现一个简易的web表单生成器,网络编程PHP Web表单生成器案例分析

本文实例讲述了PHP Web表单生成器。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.实例&#xff1a;2. 需求分析在项目的实际开发中&#xff0c;经常需要设计各种各样表单。直接编写HTML表单虽然简单&#xff0c;但修改、维护相对麻烦。因此&#xff0c;可以利用PHP实…

php瀑布墙,phpwind Next增加“瀑布流”图墙展示模式

近日&#xff0c;化龙巷网站CEO钱钰在微博上爆出phpwind最新版本的部分截图&#xff0c;引发行业关注。据悉&#xff0c;该版本或命名“Next”&#xff0c;目前&#xff0c;phpwind官方暂未对外披露新版本相关信息,也未公布项目的进展。从流传的产品首页效果图来看&#xff0c;…

管理员信息模块php,管理员模块功能代码

摘要&#xff1a;<?php /*** Created by PhpStorm.* User: Administrator* Date: 2019/5/10* Time: 10:12*/namespace app\admin\contro<?php /*** Created by PhpStorm.* User: Administrator* Date: 2019/5/10* Time: 10:12*/namespace app\admin\controller;use app…

php项目的建立,PHP开发-ZendStudio初学教程-建立PHP项目

英文描述Project Name: Enter the name of your project.Location: Enter the location folder for your project.PHP Server :- Click the drop-down menu and select an existing server for deploying the new server project, or click Add Server to create a new server.…

matlab中随机森林实现,随机森林实现 MATLAB

matlab 中随机森林工具箱的下载地址&#xff1a;http://code.google.com/p/randomforest-matlab/downloads/detail?nameWindows-Precompiled-RF_MexStandalone-v0.02-.zip&can2&q%% 基于随机森林思想的组合分类器设计%% 清空环境变量clear allclcwarning off%% 导入数…

MATLAB电压不平衡,电力系统不对称故障计算的Matlab算法程序

NF1;for i11:NFclear;n19;n29;n09;nl115;nl215;nl015;Lfinput(请输入短路类型(单相接地短路输入‘1’&#xff0c;两相短路输入‘2’&#xff0c;两相短路接地输入‘3’):Lf);f7;If0;zf0;zg0;B1 [0 1 0.0553i 0 1 0 ;0 2 0.1228i 0 1 0;0 3 0.1785i 0 1 0 ;1 4 0.0476i 0 1.050…

matlab示波器有功功率,巧用示波器计算功率-测试测量-与非网

示波器主要用于测量电流和电压&#xff0c;然后通过一系列魔术般的数学公式就可以计算出功率。遗憾的是&#xff0c;功率有许多种类&#xff1a;瞬时功率、有功功率、视在功率和无功功率。这么多的功率术语经常让人感到困惑。本文介绍了如何在Teledyne LeCroy HDO 6000示波器上…

matlab ctrb(),4.8Matlab问题能控能观解释.ppt

Ch.4 线性系统的能控性和能观性 Matlab问题(1/1) 4.8 Matlab问题 本章涉及的计算问题主要有 状态能控性/能观性判定、 系统能控能观分解、 能控/能观规范形变换以及 能控/能观规范形实现。 下面分别介绍基于Matlab的上述问题的程序编制和计算方法。 状态能控性与能观性判定 (1/…

matlab如何导入多文本数据,将文本文件中的混合数据导入表

样本文件概述样本文件 outages.csv 包含表示美国电力中断的数据。文件的前几行如下&#xff1a;Region,OutageTime,Loss,Customers,RestorationTime,CauseSouthWest,2002-01-20 11:49,672,2902379,2002-01-24 21:58,winter stormSouthEast,2002-01-30 01:18,796,336436,2002-02…

php 表单提交文件大小,PHP如何通过表单直接提交大文件详解

PHP如何通过表单直接提交大文件详解前言我想通过表单直接提交大文件&#xff0c;django 那边我就是这么干的。而对于 php 来说&#xff0c;我认为尽管可以设置最大上传的大小&#xff0c;但最大也无法超过内存大小&#xff0c;因为它无法把文件内容都放到 php://input 里面。直…

wordpress url index.php,WordPress对URL的路由解析过程详解

本文说明WP 对URL rewrite并生成当前请求的过程. 实际内容并不复杂, 说的比较啰嗦啦…关于Query Vars这是Wordpress全部代码中最重要的变量,所谓的query vars是一系列变量集合. WP通过解析URL设定query vars, 并通过分析query vars值决定显示那些文章,设定标志位等.所谓标志位是…

matlab m文件的编写,Matlab实验报告(四)M文件的编写.doc

Matlab实验报告(四)M文件的编写.doc实验目的学习MATLAB屮的关系运算和逻辑运算&#xff0c;掌握它们的表达形式和川法。掌握MATLAB中的选择结构和循环结构。学会用MATLAB进行M文件的编写和调用。—、预备知识关系和逻辑运算关系运算符用来完成关系运算&#xff0c;在控制程序流…

php登陆项目,ThinkPHP6项目基操(14.实战部分 中间件处理登录流程)

一、定义中间件namespace app\middleware;class Check{public function handle($request, \Closure $next){if ($request->param(name) think) {return redirect(index/think);}return $next($request);}}中间件类可以随意命名&#xff0c;中间件的入口执行方法必须是handl…

刻意学习之道

所谓刻意学习&#xff0c;不是简单的指所谓的“一万小时定律”&#xff0c;而是要走出自己能力的舒适区&#xff0c;挑战自己的极限&#xff0c;向高人学习&#xff0c;从而得以让个人进步突飞猛进&#xff01;