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,也正是如此,使的它变的...
RabbitMQ学习实践二:MQ的安装
3. **Topic模式**:Topic模式允许使用通配符进行路由,如`*.log`或`audit.#`。这种模式在需要根据消息类型进行路由时非常有用。创建Topic交换机并发送消息: ```java @Bean public TopicExchange topicExchange() {...
RabbitMQ分发方式:主题模式思维脑图
rabbitmq-server-3.9.11.exe
**RabbitMQ 消息中间件在抢购场景中的应用** 在现代互联网应用中,抢购活动已经成为一种常见的促销手段,吸引大量用户在同一时间参与。为了处理这种高并发的业务场景,开发人员需要采取有效的方式来分发和处理大量...
本文档为 RabbitMq 使用手册,介绍了 RabbitMq 的应用场景和开发指导。RabbitMq 是一个由 Erlang 开发的 AMQP(Advanced Message Queue)流行的开源消息队列系统。RabbitMq 的结构图如下: RabbitMq 几个概念说明:...
【RabbitMQ集群搭建指南】 在企业IT架构中,消息队列(MQ)扮演着至关重要的角色,它能够实现异步处理、解耦系统组件、提高系统吞吐量。RabbitMQ作为开源MQ的佼佼者,凭借其高效、稳定和易扩展的特性,广泛应用于...
rabbitmq-3.10.6:management
【课程目录】:---第一章:RabbitMQ介绍----1-什么是消息中间件.mp4----2-RabbitMQ消息队列安装:window环境.mp4----3-RabbitMQ消息队列安装 :Linux环境.mp4----4-Rabbitmq入口示例:server.mp4----5-rabbitmq入口...
《RabbitMQ实战:高效部署分布式消息队列》是一本深度解析RabbitMQ技术的书籍,专注于帮助读者理解和掌握如何在实际项目中高效地部署和使用这个强大的消息中间件。RabbitMQ作为开源的消息代理和队列服务器,广泛应用...
1. 拉取 RabbitMQ 镜像:使用 Docker 的 pull 命令拉取 RabbitMQ 镜像,例如:`docker pull rabbitmq:3.9.8-management`。 2. 启动 RabbitMQ 容器:使用 Docker 的 run 命令启动 RabbitMQ 容器,例如:`docker run -...
rabbitmq-3.7.28-management-alpine 离线镜像安装包
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还提供了多种交换机类型,包括direct exchange、fanout exchange、topic exchange、headers exchange等,可以满足不同的路由需求。 RabbitMQ的主要特点包括: * 可靠性:RabbitMQ提供了多种机制来保证消息...
rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:...
rabbitmq: host: your-rabbitmq-host port: your-rabbitmq-port username: your-username password: your-password ``` 然后,定义消息的交换机(Exchange)、队列(Queue)以及路由键(Routing Key)。这通常...
- **五种交换器类型**:Direct、Fanout、Topic、Header和Routing,以及它们在不同场景下的应用。 **2. 安装与配置** - **安装RabbitMQ**:在各种操作系统(如Linux、Windows、macOS)上安装和启动RabbitMQ服务。 - ...
C# rabbitmq项目实战源码,在网上找了大量的MQ资料用C#语言开发的各种场景示例,从路由及列队的配置,到场景代码的开发,使用场景基本上都是通过生产者与消费者,发布订阅模式的示例,程序使用WindowForm开发的重要...