From e775d389c04c254e4014211e659a2f65104c47ee Mon Sep 17 00:00:00 2001 From: fleyx Date: Wed, 8 Jan 2025 00:06:01 +0800 Subject: [PATCH] add --- rabbitmq/.gitignore | 38 ++++++++++++ rabbitmq/pom.xml | 60 +++++++++++++++++++ .../java/org/example/BackendApplication.java | 14 +++++ .../example/config/DirectRabbitConfig.java | 43 +++++++++++++ .../org/example/config/TopicRabbitConfig.java | 43 +++++++++++++ .../controller/MqDirectController.java | 30 ++++++++++ .../example/controller/MqTopicController.java | 47 +++++++++++++++ .../java/org/example/entity/mq/MqMessage.java | 14 +++++ .../example/listener/AutoCreateListener.java | 36 +++++++++++ rabbitmq/src/main/resources/application.yml | 7 +++ 10 files changed, 332 insertions(+) create mode 100644 rabbitmq/.gitignore create mode 100644 rabbitmq/pom.xml create mode 100644 rabbitmq/src/main/java/org/example/BackendApplication.java create mode 100644 rabbitmq/src/main/java/org/example/config/DirectRabbitConfig.java create mode 100644 rabbitmq/src/main/java/org/example/config/TopicRabbitConfig.java create mode 100644 rabbitmq/src/main/java/org/example/controller/MqDirectController.java create mode 100644 rabbitmq/src/main/java/org/example/controller/MqTopicController.java create mode 100644 rabbitmq/src/main/java/org/example/entity/mq/MqMessage.java create mode 100644 rabbitmq/src/main/java/org/example/listener/AutoCreateListener.java create mode 100644 rabbitmq/src/main/resources/application.yml diff --git a/rabbitmq/.gitignore b/rabbitmq/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/rabbitmq/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/rabbitmq/pom.xml b/rabbitmq/pom.xml new file mode 100644 index 0000000..0a6f988 --- /dev/null +++ b/rabbitmq/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.13 + + + + org.example + rabbitmq + 1.0-SNAPSHOT + + + 11 + 11 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-web + + + cn.hutool + hutool-all + 5.8.11 + + + org.springframework.boot + spring-boot-starter-amqp + + + org.projectlombok + lombok + true + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + \ No newline at end of file diff --git a/rabbitmq/src/main/java/org/example/BackendApplication.java b/rabbitmq/src/main/java/org/example/BackendApplication.java new file mode 100644 index 0000000..d709e2b --- /dev/null +++ b/rabbitmq/src/main/java/org/example/BackendApplication.java @@ -0,0 +1,14 @@ +package org.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = "org.example") + +public class BackendApplication { + + public static void main(String[] args) { + SpringApplication.run(BackendApplication.class, args); + } + +} diff --git a/rabbitmq/src/main/java/org/example/config/DirectRabbitConfig.java b/rabbitmq/src/main/java/org/example/config/DirectRabbitConfig.java new file mode 100644 index 0000000..40fd9c7 --- /dev/null +++ b/rabbitmq/src/main/java/org/example/config/DirectRabbitConfig.java @@ -0,0 +1,43 @@ +package org.example.config; + +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +@Configuration +@Component +public class DirectRabbitConfig { + + public final static String DIRECT_ONE = "direct.one"; + public final static String DIRECT_TWO= "direct.two"; + public final static String DIRECT_EXCHANGE= "directExchange1"; + + @Bean + public Queue directQueueOne(){ + return new Queue(DIRECT_ONE); + } + + @Bean + public Queue directQueueTwo(){ + return new Queue(DIRECT_TWO); + } + + @Bean + DirectExchange directExchange(){ + return new DirectExchange(DIRECT_EXCHANGE); + } + + @Bean + Binding bindingDirectExchangeOne(Queue directQueueOne, DirectExchange directExchange){ + return BindingBuilder.bind(directQueueOne).to(directExchange).with("direct.one"); + } + + @Bean + Binding bindingDirectExchangeTwo(Queue directQueueTwo, DirectExchange directExchange){ + //# 表示零个或多个词 + //* 表示一个词 + return BindingBuilder.bind(directQueueTwo).to(directExchange).with("direct.#"); + } + +} \ No newline at end of file diff --git a/rabbitmq/src/main/java/org/example/config/TopicRabbitConfig.java b/rabbitmq/src/main/java/org/example/config/TopicRabbitConfig.java new file mode 100644 index 0000000..8bebb03 --- /dev/null +++ b/rabbitmq/src/main/java/org/example/config/TopicRabbitConfig.java @@ -0,0 +1,43 @@ +package org.example.config; + +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +@Configuration +@Component +public class TopicRabbitConfig { + + public final static String TOPIC_ONE = "topic.one"; + public final static String TOPIC_TWO = "topic.two"; + public final static String TOPIC_EXCHANGE = "topicExchange1"; + + @Bean + public Queue queueOne(){ + return new Queue(TOPIC_ONE); + } + + @Bean + public Queue queueTwo(){ + return new Queue(TOPIC_TWO); + } + + @Bean + TopicExchange topicExchange(){ + return new TopicExchange(TOPIC_EXCHANGE); + } + + @Bean + Binding bindingExchangeOne(Queue queueOne, TopicExchange topicExchange){ + return BindingBuilder.bind(queueOne).to(topicExchange).with("topic.one"); + } + + @Bean + Binding bindingExchangeTwo(Queue queueTwo, TopicExchange topicExchange){ + //# 表示零个或多个词 + //* 表示一个词 + return BindingBuilder.bind(queueTwo).to(topicExchange).with("topic.#"); + } + +} \ No newline at end of file diff --git a/rabbitmq/src/main/java/org/example/controller/MqDirectController.java b/rabbitmq/src/main/java/org/example/controller/MqDirectController.java new file mode 100644 index 0000000..3387972 --- /dev/null +++ b/rabbitmq/src/main/java/org/example/controller/MqDirectController.java @@ -0,0 +1,30 @@ +package org.example.controller; + +import org.example.config.TopicRabbitConfig; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/direct") +public class MqDirectController { + @Autowired + private RabbitTemplate rabbitTemplate; + @GetMapping("/simple") + public void sendSimple(){ + this.rabbitTemplate.convertAndSend("topic.one","abc"); + } + + @GetMapping("/one") + public void sendOne(){ + this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE,"topic.one","abc"); + } + + @GetMapping("/two") + public void sendTwo(){ + this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE,"topic.two",System.currentTimeMillis()); + } + +} diff --git a/rabbitmq/src/main/java/org/example/controller/MqTopicController.java b/rabbitmq/src/main/java/org/example/controller/MqTopicController.java new file mode 100644 index 0000000..5805d74 --- /dev/null +++ b/rabbitmq/src/main/java/org/example/controller/MqTopicController.java @@ -0,0 +1,47 @@ +package org.example.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import org.example.config.TopicRabbitConfig; +import org.example.entity.mq.MqMessage; +import org.example.listener.AutoCreateListener; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/topic") +public class MqTopicController { + @Autowired + private RabbitTemplate rabbitTemplate; + + @GetMapping("/simple") + public void sendSimple() { + this.rabbitTemplate.convertAndSend("topic.one", "abc"); + } + + @GetMapping("/one") + public void sendOne() { + this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE, "topic.one", "abc"); + } + + @GetMapping("/two") + public void sendTwo() { + this.rabbitTemplate.convertAndSend(TopicRabbitConfig.TOPIC_EXCHANGE, "topic.two", System.currentTimeMillis()); + } + + @GetMapping("/autoCreateQueue") + public void autoCreateQueue() { + MessagePostProcessor postProcessor = message -> { + message.getMessageProperties().setHeader("unique-id", IdUtil.fastSimpleUUID()); + return message; + }; + this.rabbitTemplate.convertAndSend(AutoCreateListener.EXCHANGE, AutoCreateListener.KEY, + new MqMessage(RandomUtil.randomString(3), RandomUtil.randomString(5)), postProcessor); + } +} diff --git a/rabbitmq/src/main/java/org/example/entity/mq/MqMessage.java b/rabbitmq/src/main/java/org/example/entity/mq/MqMessage.java new file mode 100644 index 0000000..922f046 --- /dev/null +++ b/rabbitmq/src/main/java/org/example/entity/mq/MqMessage.java @@ -0,0 +1,14 @@ +package org.example.entity.mq; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +public class MqMessage implements Serializable { + private static final long serialVersionUID = -4465394232288598749L; + private String name; + private String code; +} diff --git a/rabbitmq/src/main/java/org/example/listener/AutoCreateListener.java b/rabbitmq/src/main/java/org/example/listener/AutoCreateListener.java new file mode 100644 index 0000000..101b8c2 --- /dev/null +++ b/rabbitmq/src/main/java/org/example/listener/AutoCreateListener.java @@ -0,0 +1,36 @@ +package org.example.listener; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.example.entity.mq.MqMessage; +import org.springframework.amqp.core.ExchangeTypes; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageProperties; +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.RabbitListener; +import org.springframework.amqp.support.AmqpHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class AutoCreateListener { + public static final String QUEUE = "autoCreateQueue"; + public static final String EXCHANGE = "autoCreateExchange"; + public static final String KEY = "autoCreate"; + + @RabbitListener(bindings = @QueueBinding( + value = @Queue(value = QUEUE, durable = "true", autoDelete = "false"), + exchange = @Exchange(value = EXCHANGE, type = ExchangeTypes.TOPIC), + key = {KEY} + ), concurrency = "4", ackMode = "MANUAL") + public void process(Channel channel, Message message, @Payload MqMessage body ) throws Exception { + MessageProperties properties = message.getMessageProperties(); + log.info("收到消息:{},{},{},{}", properties.getDeliveryTag(), properties.getHeader("unique-id"), properties.getReceivedRoutingKey(), new ObjectMapper().writeValueAsString(body)); + channel.basicAck(properties.getDeliveryTag(), false); + } +} diff --git a/rabbitmq/src/main/resources/application.yml b/rabbitmq/src/main/resources/application.yml new file mode 100644 index 0000000..f5368e2 --- /dev/null +++ b/rabbitmq/src/main/resources/application.yml @@ -0,0 +1,7 @@ +spring: + rabbitmq: + host: 127.0.0.1 #地址 + port: 5672 #端口 + username: admin #用户名 + password: admin #密码 + virtual-host: test1 #虚拟主机路径 \ No newline at end of file