7、Topic
Topics
- In the previous tutorial we improved our logging system. Instead of using a fanout exchange only capable of dummy broadcasting,we used a direct one ,and gained a possibility of selectively receiving the logs.
- Although using the direct exchange improved our system,it still has limitations - it can't do routing based on multiple criteria.
- In our logging system we might want to subscribe to not only logs based on severity,but also based on the source which emitted the log.You might know this concept from the syslog unix tool,which routes logs based on both severity and facility.
- That would give us a lot of flexibility - we may want to listen to just critical error coming from 'cron' but also all logs from 'kern'.
- To implement that in our logging system we need to learn about a more complex topic exchange.
Topic exchange
Message sent to a topic exchange can't have an arbitrary routing_key - it must be a list of words,delimited by dots.The words can be anything, but usually they specify some features connected to the message.A few valid routing key examples:"stock.usd.nyse","nyse.vmw","quick.orange.rabbit".There can be as many words in the routing key as you like, up to the limit of 255 bytes.
The binding key must also be in the same form.The logic behind the topic exchange is similar to a direct one - a message sent with a particular routing key will be delivered to all the queues that are bound with a matching binding key.However there are two important special cases for binding keys:
- (star) can substitute for exactly one word.
- (hash) can substitute for zero or more words.
In this example,we're going to send message which all describe animals.The messages will be sent with a routing key that consists of three words(two dots).The first word in the routing key will describe speed,second a colour and third a species:"..".
We created three bindings: Q1 is bound with binding key ".orange." and Q2 with "..rabbit" and "lazy.#".
These bindings can be summarised as:
- Q1 is interested in all the orange animals.
- Q2 wants to hear everything about rabbits, and everything about lazy animals.
A message with a routing key set to "quick.orange.rabbit" will be delivered to both queues. Message "lazy.orange.elephant" also will go to both of them. On the other hand "quick.orange.fox" will only go to the first queue, and "lazy.brown.fox" only to the second. "lazy.pink.rabbit" will be delivered to the second queue only once, even though it matches two bindings. "quick.brown.fox" doesn't match any binding so it will be discarded.
What happens if we break our contract and send a message with one or four words, like "orange" or "quick.orange.male.rabbit"? Well, these messages won't match any bindings and will be lost.
On the other hand "lazy.orange.male.rabbit", even though it has four words, will match the last binding and will be delivered to the second queue.
Code
public class EmitLogTopic {
private static Log log = LogFactory.getLog(EmitLogTopic.class);
private static final String EXCHANGE_NAME="topic_logs";
public static void main(String[] argv)
{
ConnectionFactory connFactory = new ConnectionFactory();
connFactory.setHost("localhost");
Connection conn=null;
Channel channel=null;
try {
conn=connFactory.newConnection();
channel=conn.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
//String[] severity={"info.#","warning.*","*.error.*"};
String message="info.hello,world";
channel.basicPublish(EXCHANGE_NAME,"info.fasfa.fasfas.fasfa",null,message.getBytes());//消息以info开头
System.out.println("sent:"+message);
/*for(String s:severity)
{
channel.basicPublish(EXCHANGE_NAME,s,null,message.getBytes());
System.out.println("sent:"+s+" "+message);
}*/ } catch (IOException e) {
log.error(e);
} catch (TimeoutException e) {
log.error(e);
} finally {
if (channel!=null)
{
try {
channel.close();
} catch (IOException e) {
log.error(e);
} catch (TimeoutException e) {
log.error(e);
}
}
if (conn!=null)
{
try {
conn.close();
} catch (IOException e) {
log.error(e);
}
}
} }
}
public class ReceiveLogTopic {
private static Log log= LogFactory.getLog(ReceiveLogTopic.class);
private static final String EXCHANGE_NAME="topic_logs";
public static void main(String[] argv)
{
ConnectionFactory connFactory = new ConnectionFactory();
connFactory.setHost("localhost");
/*Connection conn=null;
Channel channel=null;*/
try {
final Connection conn=connFactory.newConnection();
final Channel channel=conn.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
String queueName=channel.queueDeclare().getQueue(); String[] severity={"info.#","warning.*","*.error.*"};
/*for (String s:severity)
{
channel.queueBind(queueName,EXCHANGE_NAME,s);
}*/
channel.queueBind(queueName,EXCHANGE_NAME,"info.#");//消费者关注关于info的消息,消息以info开头
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("receive:"+envelope.getRoutingKey()+" "+message);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.error(e);
}finally {
channel.basicAck(envelope.getDeliveryTag(),false);
}
}
};
channel.basicConsume(queueName,false,consumer);
} catch (IOException e) {
log.error(e);
} catch (TimeoutException e) {
log.error(e);
} finally {
}
}
}
Summary
- 消费者通过使用通配符关注一个有关的话题,当符合适配条件的消息传递路由器时,就会被分发到该监听队列,被消费者获得。
- 例如 消费者关注info消息(info.#),当所有routing key 以info开头的消息都会被分发到。
- 所有这些都是以consumer为关注点的。
7、Topic的更多相关文章
- 《Kafka笔记》2、环境搭建、Topic管理
目录 一.Kafka环境搭建和Topic管理 1 单机环境搭建 1.1 环境准备 1.1.1 JDK 安装 1.1.2 配置主机名和ip 1.1.3 关闭防火墙和防火墙开机自启动 1.1.4 zook ...
- ActiveMQ——activemq的详细说明,queue、topic的区别(精选)
JMS中定义了两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic).主要区别就是是否能重复消费. 点对点:Queue,不可重 ...
- rabbitmq direct、fanout、topic 三种Exchange java 代码比较
Producer端 1.channel的创建 无论是才用什么样的Exchange,创建channel代码都是相同的,如下 ConnectionFactory factory = new Connect ...
- RabbitMQ ——与Spring集成及exchange的direct、topic方式实现和简单队列实现
程序整体结构 Maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...
- go语言nsq源码解读九 tcp和http中channel、topic的增删
通过前面多篇文章,nsqlookupd基本已经解读完毕了,不过在关于channel和topic的增删上还比较模糊,所以本篇将站在宏观的角度来总结一下,tcp.go和http.go两个文件中关于chan ...
- 5、RabbitMQ - Exchange之 fanout \ 【direct 关键字发送】 \ topic
pytho系列之 RabbitMQ - Exchange几种模式 RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 Rab ...
- RabbitMQ、Memcache、Redis(队列、缓存)
RabbitMQ 一.解释 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消 ...
- RabbitMQ学习总结 第六篇:Topic类型的exchange
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 柯南君:看大数据时代下的IT架构(8)消息队列之RabbitMQ--案例(topic起航)
二.Topic(主题) (using the Java client) 上一篇文章中,我们进步改良了我们的日志系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fano ...
随机推荐
- luoguP5094 [USACO04OPEN]MooFest 狂欢节
get 到的 这种需要求 含 max 的式子,枚举最大值的方法非常普遍. 类似的,还有含 min , gcd 的式子,枚举他们也很普遍 主要难点 我们首先想到,先按 v 从小到大排序,因为这样既可以简 ...
- c# WF 第7节 对控件的基本操作
本节内容: 1:修改控件的大小 2:控件的顺序 3:控件的对齐 4:移动button实例 1: 修改控件的大小 第一种: 第二种 : 一次操作多个控件: 选择一个控件.按住ctrl -- 再选择一个控 ...
- 5. git-lab 项目操作
项目操作 一.给成员授权项目权限 之前我们是给组增加成员. 当有的项目需要给组下面的成员授权不一样的时候. 我们需要在项目里面给成员授权权限 点击管理区域 点这个项目 看下图,我们可以看到 现在这 ...
- JAVA字符串转换整数
public class compint { /** * @param args */ public static void main(String[] args) { // TODO Auto-ge ...
- aiomysql
aiomysql: import aiomysql import asyncio async def aiomysql_test(): loop = asyncio.get_event_loop() ...
- pandas 排序之 sort_values,reindex,reset_index, sort_index
如果想按照自己的方式排序ind = 行索引data= data[ind] ind = data.sum(axis=1).sort_values(ascending=False).index data ...
- 展示出版社:写上URL地址对应函数、函数当中查询出所有的出版社、对象交给模板、循环对象拿出每条数据展示
URL: from django.conf.urls import urlfrom django.contrib import adminfrom app01 import views urlpatt ...
- Bootstrap分页查询
前台方法: function show() { $('#reportTable').bootstrapTable({ method: 'get', url: "@Url.Action(&qu ...
- CF-1132 C.Painting the Fence
题目大意:现在有n个栅栏板,p个工人,每个工人可以涂一段区间的栅栏板,问如果雇佣p-2个工人,最多可以涂多少块栅栏板. 做法:先求出q个工人能涂得最多木板数,并统计每个木板被涂的次数.求被涂一次的木板 ...
- 为Azure DevOps Server (TFS) 配置安全访问(HTTPS with SSL)
Contents 1. 概述 2. HTTP和HTTS比较 支持HTTP和HTTPS两种方式 要求所有连接使用HTTPS 优点: 缺点: 3. 为Azure DevOps Server 配置安全访问 ...