一、简单模式
简单模式(Simple):一个生产者,一个消费者
java
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";
@Autowired
private 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): 多个消费者竞争消息
java
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";
@Autowired
private 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):一个生产者,多个消费者
java
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 = "";
@Autowired
private 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):根据路由键将消息转发到对应队列
java
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";
@Autowired
private 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):使用通配符匹配路由键
java
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";
@Autowired
private 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);
}
}