Topic转发器的功效包含fanout、direct类型的转发器,其特殊的地方在于转发器与队列的绑定时routingkey可以使用通配符*、#,使用*就相当于fanout,不使用通配符就相当于direct,否则就是模糊匹配,匹配上的队列都可以收到消息
topic转发器:
channel.exchangeDeclare("topic_logs", "topic");
channel.basicPublish("topic_logs", severity , null, SerializationUtils.serialize(object));
转发器与队列的绑定(指定routingkey),与direct转发器的差异在于routingkey可以使用*、#通配符模糊匹配:
//在绑定临时队列和转发器时指定routingkey
channel.queueBind(queueName, "topic_logs", severity);
package com.demo.mq.rabbitmq.example05;
import java.io.IOException;
import java.io.Serializable;
import java.util.Random;
import org.apache.commons.lang3.SerializationUtils;
import com.demo.mq.rabbitmq.MqManager;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
/**
* 发送消息类
* @author sheungxin
*
*/
public class Send{
/**
* 发送消息,topic转发器,通过routingKey模糊匹配相应的queue
* @param object 消息主体
* @throws IOException
*/
public static void sendAToB(Serializable object) throws Exception{
Connection conn=MqManager.newConnection();
Channel channel=conn.createChannel();
channel.exchangeDeclare("topic_logs", "topic");
for(int i=0;i<9;i++){
String severity=getSeverity();
channel.basicPublish("topic_logs", severity , null, SerializationUtils.serialize(object));
System.out.println(severity+":Send '"+object+"'");
}
channel.close();
conn.close();
}
private static String getSeverity(){
String[] severities=new String[]{"kernal.info","kernal.warn","kernal.error","auth.info","auth.warn","auth.error"};
Random random=new Random();
return severities[random.nextInt(6)];
}
public static void main(String[] args) throws Exception {
sendAToB("Hello World !");
}
}
package com.demo.mq.rabbitmq.example05;
import java.io.IOException;
import java.util.Random;
import org.apache.commons.lang3.SerializationUtils;
import com.demo.mq.rabbitmq.MqManager;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
/**
* 接收消息类
* @author sheungxin
*
*/
public class Recv {
/**
* 用于接收消息,创建一个临时队列,绑定在转发器topic上,并模糊指定routingKey
* @param queue
* @throws Exception
*/
public static void recvAToB() throws Exception{
Connection conn=MqManager.newConnection();
Channel channel=conn.createChannel();
channel.exchangeDeclare("topic_logs", "topic");
//创建一个临时队列
String queueName=channel.queueDeclare().getQueue();
//绑定临时队列和转发器logs
String severity=getSeverity();
channel.queueBind(queueName, "topic_logs", severity);
System.out.println(severity+":Received ...");
Consumer consumer=new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException{
String mes=SerializationUtils.deserialize(body);
System.out.println(envelope.getRoutingKey()+":Received :'"+mes+"' done");
}
};
//关闭自动应答机制,默认开启;这时候需要手动进行应该
channel.basicConsume(queueName, true, consumer);
}
private static String getSeverity(){
String[] severities=new String[]{"*.info","*.warn","*.error","kernal.*","auth.*"};
Random random=new Random();
return severities[random.nextInt(5)];
}
public static void main(String[] args) throws Exception {
recvAToB();
}
}
分享到:
相关推荐
Go语言版本rabbitmq消息队列库:simple、worker、Fanout 模型、Direct 模型、Topic模型。 RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的...
springboot集成rabbitmq,三种模式:fanout direct topic的实现,入门级别
RabbitMQ分发方式:主题模式思维脑图
rabbitmq-server-3.9.11.exe
本文档为 RabbitMq 使用手册,介绍了 RabbitMq 的应用场景和开发指导。RabbitMq 是一个由 Erlang 开发的 AMQP(Advanced Message Queue)流行的开源消息队列系统。RabbitMq 的结构图如下: RabbitMq 几个概念说明:...
RabbitMQ 的使用场景包括: 1. 服务间异步通信 2. 顺序消费 3. 定时任务 4. 请求削峰 RabbitMQ 的工作机制: 1. 生产者将消息发布到交换器上 2. 交换器根据路由键将消息路由到特定的队列 3. 消息到达队列,消费者...
【课程目录】:---第一章:RabbitMQ介绍----1-什么是消息中间件.mp4----2-RabbitMQ消息队列安装:window环境.mp4----3-RabbitMQ消息队列安装 :Linux环境.mp4----4-Rabbitmq入口示例:server.mp4----5-rabbitmq入口...
如题,C#的Demo项目:RabbitMQ封装和使用, 引用了RabbitMQ.Client 版本:3.6.9 RabbitMQ .NET客户端操作类库, 并简单展示了3种Exchange的使用
在当今信息技术迅速...此外,文档还提供了使用HAProxy实现负载均衡的方法,旨在提升整体架构的高可用性和性能。通过这些详尽的指导,IT专业人员可以有效搭建和管理RabbitMQ集群,确保企业消息系统的稳定和高效运行。
以抢购为例, 给抢购用户发布消息
RabbitMQ实战: 高效部署分布式消息队列,高质量文档分享,请珍惜!
RabbitMQ示例5:主题【topic切换】 RabbitMQ示例6:远程过程调用RPC Pom.xml <? xml version = " 1.0 " encoding = " UTF-8 " ?> < project xmlns = " http://maven.apache.org/POM/4.0.0 " xmlns : ...
RabbitMQ-HelloWorld:RabbitMQ的Hello World示例
image : rabbitmq:3-management container_name : rabbitmq volumes : - rabbitmq-vol:/var/lib/rabbitmq - rabbitmq-log:/var/log/rabbitmq - ./conf/:/etc/rabbitmq/ networks : - rabbitmq-net 步骤2:...
rabbitmq-3.10.6:management
RabbitMQ还提供了多种交换机类型,包括direct exchange、fanout exchange、topic exchange、headers exchange等,可以满足不同的路由需求。 RabbitMQ的主要特点包括: * 可靠性:RabbitMQ提供了多种机制来保证消息...
1. 拉取 RabbitMQ 镜像:使用 Docker 的 pull 命令拉取 RabbitMQ 镜像,例如:`docker pull rabbitmq:3.9.8-management`。 2. 启动 RabbitMQ 容器:使用 Docker 的 run 命令启动 RabbitMQ 容器,例如:`docker run -...
RabbitMQ 是一个功能强大且灵活的消息队列系统,通过使用 RabbitMQ,可以解决企业应用系统领域中的通信、集成与整合问题。RabbitMQ 的出现是为了解决异构系统中的分布式调用与通信问题,使得系统之间的信息传递变得...
跑步docker run -d --hostname rabbitserver --name rabbitmq-server -p 15672:15672 -p 5672:5672 rabbitmq:3-managementRabbitMQ服务器要查看服务器管理,您应该使用在docker image上配置的端口转到本地主机...
RabbitMQ实战 高效部署分布式消息队列 RabbitMQ实战 高效部署分布式消息队列