一、简单模式
简单模式(Simple):一个生产者,一个消费者
package com.qiangesoft.rabbitmq.mode.simple;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
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;/*** 简单模式* ps:一个生产者,一个消费者** @author qiangesoft* @date 2024-05-08*/
@Slf4j
@RequestMapping("/simple")
@RestController
public class SimpleMode {private final String QUEUE = "simple.queue";@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 生产者*/@GetMapping("/send")public void send(String message) {rabbitTemplate.convertAndSend(QUEUE, message);}/*** 消费者*/@RabbitListener(queuesToDeclare = @Queue(name = QUEUE))public void receiveMessage(String message) {log.info("Received Message: " + message);}}
二、工作模式
工作队列模式(Work Queue): 多个消费者竞争消息
package com.qiangesoft.rabbitmq.mode.work;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
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;/*** 工作模式* ps:多个消费者竞争消息** @author qiangesoft* @date 2024-05-08*/
@Slf4j
@RequestMapping("/work")
@RestController
public class WorkMode {private final String QUEUE = "work.queue";@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 生产者*/@GetMapping("/send")public void send(String message) {for (int i = 0; i < 10; i++) {rabbitTemplate.convertAndSend(QUEUE, message + i);}}/*** 消费者1*/@RabbitListener(queuesToDeclare = @Queue(name = QUEUE))public void receiveMessage1(String message) {log.info("Received Message by consumer1: " + message);}/*** 消费者2*/@RabbitListener(queuesToDeclare = @Queue(name = QUEUE))public void receiveMessage2(String message) {log.info("Received Message by consumer2: " + message);}}
三、发布订阅模式
发布/订阅模式(Publish/Subscribe):一个生产者,多个消费者
package com.qiangesoft.rabbitmq.mode.pubsub;import lombok.extern.slf4j.Slf4j;
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.RabbitListener;
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;/*** 发布/订阅模式* ps:一个生产者,多个消费者** @author qiangesoft* @date 2024-05-08*/
@Slf4j
@RequestMapping("/pubsub")
@RestController
public class PubSubMode {private final String EXCHANGE = "fanout.exchange";private final String KEY = "";@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 生产者*/@GetMapping("/send")public void sendM(String message) {rabbitTemplate.convertAndSend(EXCHANGE, KEY, message);}/*** 消费者1*/@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.FANOUT)))public void receiveMessage1(String message) {log.info("Received Message by consumer1: " + message);}/*** 消费者2*/@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.FANOUT)))public void receiveMessage2(String message) {log.info("Received Message by consumer2: " + message);}}
四、路由模式
路由模式(Routing):根据路由键将消息转发到对应队列
package com.qiangesoft.rabbitmq.mode.routing;import lombok.extern.slf4j.Slf4j;
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.RabbitListener;
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;/*** 路由模式* ps:根据路由键将消息转发到对应队列** @author qiangesoft* @date 2024-05-08*/
@Slf4j
@RequestMapping("/routing")
@RestController
public class RoutingMode {private final String EXCHANGE = "direct.exchange";private final String KEY1 = "direct1";private final String KEY2 = "direct2";@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 生产者*/@GetMapping("/send")public void sendM(String message) {rabbitTemplate.convertAndSend(EXCHANGE, KEY1, message);}/*** 消费者*/@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.DIRECT), key = {KEY1, KEY2}))public void receiveMessage(String message) {log.info("Received Message: " + message);}}
五、主题模式
通配符模式(Topics):使用通配符匹配路由键
package com.qiangesoft.rabbitmq.mode.topic;import lombok.extern.slf4j.Slf4j;
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.RabbitListener;
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;/*** 主题模式* ps: 使用通配符匹配路由键** @author qiangesoft* @date 2024-05-08*/
@Slf4j
@RequestMapping("/topic")
@RestController
public class TopicMode {private final String EXCHANGE = "topic.exchange";private final String QUEUE = "topic.queue";@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 生产者*/@GetMapping("/send")public void send(String message) {rabbitTemplate.convertAndSend(EXCHANGE, QUEUE, message);}/*** 消费者*/@RabbitListener(bindings = @QueueBinding(value = @Queue, exchange = @Exchange(name = EXCHANGE, type = ExchangeTypes.TOPIC), key = {"topic.*", "#.topic"}))public void receiveMessage(String message) {log.info("Received Message: " + message);}}