原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11794927.html

RMQ Topic

Project Directory

Maven Dependency

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.fool.rmq</groupId>
<artifactId>rmq</artifactId>
<version>1.0-SNAPSHOT</version> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.properties

 spring.application.name=rmq
server.port= spring.rabbitmq.host=localhost
spring.rabbitmq.port=
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin #direct part start
rmq.config.exchange=log.direct
rmq.config.queue.info=log.info
rmq.config.queue.info.routing.key=log.info.routing.key
rmq.config.queue.error=log.error
rmq.config.queue.error.routing.key=log.error.routing.key
#direct part end #topic part start
rmq.config.exchange.topic=log.topic
rmq.config.queue.topic.info=log.topic.info
rmq.config.queue.topic.error=log.topic.error
rmq.config.queue.topic.all=log.topic.all rmq.config.queue.user.info.routing.key=user.log.info
rmq.config.queue.user.debug.routing.key=user.log.debug
rmq.config.queue.user.warn.routing.key=user.log.warn
rmq.config.queue.user.error.routing.key=user.log.error rmq.config.queue.product.info.routing.key=product.log.info
rmq.config.queue.product.debug.routing.key=product.log.debug
rmq.config.queue.product.warn.routing.key=product.log.warn
rmq.config.queue.product.error.routing.key=product.log.error rmq.config.queue.order.info.routing.key=order.log.info
rmq.config.queue.order.debug.routing.key=order.log.debug
rmq.config.queue.order.warn.routing.key=order.log.warn
rmq.config.queue.order.error.routing.key=order.log.error
#topic part end

Source Code

Application.java

 package org.fool.rmq;

 import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

RmqConfig.java

 package org.fool.rmq.config;

 import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class RmqConfig { @Bean
public Queue queue() {
return new Queue("hello-rmq");
}
}

UserProducer.java

 package org.fool.rmq.topic;

 import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import java.util.Date; @Component
public class UserProducer {
@Autowired
private AmqpTemplate rmqTemplate; @Value("${rmq.config.exchange.topic}")
private String exchange; @Value("${rmq.config.queue.user.info.routing.key}")
private String infoRoutingKey; @Value("${rmq.config.queue.user.debug.routing.key}")
private String debugRoutingKey; @Value("${rmq.config.queue.user.warn.routing.key}")
private String warnRoutingKey; @Value("${rmq.config.queue.user.error.routing.key}")
private String errorRoutingKey; public void send() {
String message = "Hello User";
rmqTemplate.convertAndSend(exchange, infoRoutingKey, message + " info");
rmqTemplate.convertAndSend(exchange, debugRoutingKey, message + " debug");
rmqTemplate.convertAndSend(exchange, warnRoutingKey, message+ " warn");
rmqTemplate.convertAndSend(exchange, errorRoutingKey, message + " error");
}
}

ProductProducer.java

 package org.fool.rmq.topic;

 import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import java.util.Date; @Component
public class ProductProducer {
@Autowired
private AmqpTemplate rmqTemplate; @Value("${rmq.config.exchange.topic}")
private String exchange; @Value("${rmq.config.queue.product.info.routing.key}")
private String infoRoutingKey; @Value("${rmq.config.queue.product.debug.routing.key}")
private String debugRoutingKey; @Value("${rmq.config.queue.product.warn.routing.key}")
private String warnRoutingKey; @Value("${rmq.config.queue.product.error.routing.key}")
private String errorRoutingKey; public void send() {
String message = "Hello Product";
rmqTemplate.convertAndSend(exchange, infoRoutingKey, message + " info");
rmqTemplate.convertAndSend(exchange, debugRoutingKey, message + " debug");
rmqTemplate.convertAndSend(exchange, warnRoutingKey, message + " warn");
rmqTemplate.convertAndSend(exchange, errorRoutingKey, message + " error");
}
}

OrderProducer.java

 package org.fool.rmq.topic;

 import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import java.util.Date; @Component
public class OrderProducer {
@Autowired
private AmqpTemplate rmqTemplate; @Value("${rmq.config.exchange.topic}")
private String exchange; @Value("${rmq.config.queue.order.info.routing.key}")
private String infoRoutingKey; @Value("${rmq.config.queue.order.debug.routing.key}")
private String debugRoutingKey; @Value("${rmq.config.queue.order.warn.routing.key}")
private String warnRoutingKey; @Value("${rmq.config.queue.order.error.routing.key}")
private String errorRoutingKey; public void send() {
String message = "Hello Order";
rmqTemplate.convertAndSend(exchange, infoRoutingKey, message + " info");
rmqTemplate.convertAndSend(exchange, debugRoutingKey, message + " debug");
rmqTemplate.convertAndSend(exchange, warnRoutingKey, message + " warn");
rmqTemplate.convertAndSend(exchange, errorRoutingKey, message + " error");
}
}

TopicLogInfoConsumer.java

 package org.fool.rmq.topic;

 import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "${rmq.config.queue.topic.info}", autoDelete = "true"),
exchange = @Exchange(value = "${rmq.config.exchange.topic}", type = ExchangeTypes.TOPIC),
key = "*.log.info"
))
public class TopicLogInfoConsumer {
@RabbitHandler
public void handle(String message) {
System.out.println("consume info: " + message);
}
}

TopicLogErrorConsumer.java

 package org.fool.rmq.topic;

 import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "${rmq.config.queue.topic.error}", autoDelete = "true"),
exchange = @Exchange(value = "${rmq.config.exchange.topic}", type = ExchangeTypes.TOPIC),
key = "*.log.error"
))
public class TopicLogErrorConsumer {
@RabbitHandler
public void handle(String message) {
System.out.println("consume error: " + message);
}
}

TopicLogAllConsumer.java

 package org.fool.rmq.topic;

 import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "${rmq.config.queue.topic.all}", autoDelete = "true"),
exchange = @Exchange(value = "${rmq.config.exchange.topic}", type = ExchangeTypes.TOPIC),
key = "*.log.*"
))
public class TopicLogAllConsumer {
@RabbitHandler
public void handle(String message) {
System.out.println("consume all: " + message);
}
}

ApplicationTest.java

 package org.fool.rmq.test;

 import org.fool.rmq.Application;
import org.fool.rmq.direct.LogProducer;
import org.fool.rmq.producer.Producer;
import org.fool.rmq.topic.OrderProducer;
import org.fool.rmq.topic.ProductProducer;
import org.fool.rmq.topic.UserProducer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ApplicationTest { @Autowired
private Producer producer; @Autowired
private LogProducer logProducer; @Autowired
private UserProducer userProducer; @Autowired
private ProductProducer productProducer; @Autowired
private OrderProducer orderProducer; @Test
public void test() {
producer.send();
} @Test
public void testDirect() {
logProducer.send();
} @Test
public void testTopic() {
userProducer.send();
productProducer.send();
orderProducer.send();
}
}

Console Output

RMQ Management

RMQ Topic的更多相关文章

  1. RMQ Fanout

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11795256.html RMQ Fanout Project Directory Maven Depe ...

  2. vivo 基于原生 RabbitMQ 的高可用架构实践

    一.背景说明 vivo 在 2016 年引入 RabbitMQ,基于开源 RabbitMQ 进行扩展,向业务提供消息中间件服务. 2016~2018年,所有业务均使用一个集群,随着业务规模的增长,集群 ...

  3. RMQ Terminology

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11784644.html RMQ模型架构 RMQ Terminology Message 消息,消息是不 ...

  4. Kafka 如何读取offset topic内容 (__consumer_offsets)

    众所周知,由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets topic,并 ...

  5. Kafka如何创建topic?

    Kafka创建topic命令很简单,一条命令足矣:bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-facto ...

  6. Kafka0.8.2.1删除topic逻辑

    前提条件: 在启动broker时候开启删除topic的开关,即在server.properties中添加:  delete.topic.enable=true 命令: bin/kafka-topics ...

  7. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MBSubmit: 1594  Solved: 520[Submit] ...

  8. [bigdata] kafka基本命令 -- 迁移topic partition到指定的broker

    版本 0.9.2 创建topic bin/kafka-topics.sh --create --topic topic_name --partition 6 --replication-factor ...

  9. UVA 11235Frequent values(RMQ)

    训练指南P198 题意:给出一个非降序排列的整数数组a1, a2…… an,你的任务是对于一系列询问(i,j),回答ai, ai+1 ……aj 中出现的次数最多的次数 这题不仅学到了rmq的应用还学到 ...

随机推荐

  1. CentOS和Windows互相远程桌面方法

    https://blog.csdn.net/libaineu2004/article/details/49407883

  2. 高清摄像头MIPI接口与ARM连接【转】

    本文转载自:http://www.cnblogs.com/whw19818/p/5811299.html MIPI摄像头常见于手机.平板中,支持500万像素以上高清分辨率.它的全称为“Mobile I ...

  3. 新上线MySQL数据库规划

    新上线MySQL数据库规划1.删除test库2.删除root用户或者让root用户只可在本机登陆而对于有业务访问的数据库,在做删除root用户前需要依次确认 function.procedure.ev ...

  4. isinstance(object, classinfo) class type(name, bases, dict)

    w https://docs.python.org/3/library/functions.html#isinstance

  5. WeekMap WeakSet的用途

    1. WeekMap WeakSet有一个特性,就是加入其中的元素不会算入引用计数,所以当其他地方没有对对象的引用之后,就可以删除了,不会造成内存泄漏. WeekMap的一个用途是保存Dom节点引用, ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_1_并发与并行

    并发,相当于 一个人吃两个馒头,吃一口这个再吃一口另外一个.这里是cpu一会执行任务1,一会又执行任务2 并行,相当于两个人 吃两个馒头,各自吃各自的,这样速度就会快

  7. 接口开发01--mock接口

    开发接口的常见场景: 1.mock接口,模拟一些接口,在别的接口没有开发好的时候,你需要测试,可以先模拟一个假接口来测试.比如常见 2.若需要调用第三方接口时,比如支付接口. 3.查看数据,比如开放数 ...

  8. 获取当前进程当前runtime加载的appdomain

    using System.Runtime.InteropServices; // Add the following as a COM reference - C:\WINDOWS\Microsoft ...

  9. 【python+selenium自动化】使用pytest+allure2完成自动化测试报告的输出

    pytest的pytest-html插件是一个很方便的测试报告,运行自动化测试用例时,pytest后加上参数即可 allure是一个测试报告的框架,相比pytest-html的优势就是“逼格” 他的优 ...

  10. mysql使用触发器生成唯一订单号,

    需求:订单号唯一,并且期望是时间格式加其他字符串, 实现:采用触发机制,在新增时根据新增id值加1作为订单生成的随机且确定唯一的数,因为id唯一: 遇到问题:新增时不能提前知道id值, 解决:取到当前 ...