关于RabbitMq的基础概念和它的集中工作模式可以先看一下这篇文章:
以下是springboot集成rabbitmq的代码,比较简单,就当作是一个笔记吧
首先是pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
服务配置
server:
port:
8080
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
virtual-host: /
username: guest
password: guest
#超时时间
connection-timeout: 10000s
接下来是相关的配置类
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitmqConfig {
//交换机名
public static final String DIRECT_EXCHANGE = "myexchange";
//队列名
public static final String DIRECT_QUEUE = "myqueues";
//路由键
public static final String DIRECT_QUEUE_KEY = "routing_key";
@Bean
public DirectExchange myDirectExchange() {
//durable 表示小时是否持久化
//autoDelete 消息是否自动删除
DirectExchange directExchange = new DirectExchange(DIRECT_EXCHANGE, true, false);
return directExchange;
}
@Bean
public Queue myQueue() {
//exclusive:是否排外的 一般等于true的话用于一个队列只能有一个消费者来消费的场景
Queue queue = new Queue(DIRECT_QUEUE, true, false, false);
return queue;
}
/**
* 绑定关系
* @return
*/
@Bean
public Binding myBinder() {
return BindingBuilder.bind(myQueue()).to(myDirectExchange()).with(DIRECT_QUEUE_KEY);
}
}
生产者类
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Random;
import java.util.UUID;
@Service
public class MqSendService {
public static final String DIRECT_EXCHANGE = "myexchange";
public static final String DIRECT_QUEUE = "myqueues";
public static final String DIRECT_QUEUE_KEY = "routing_key";
@Resource
private RabbitTemplate rabbitTemplate;
public void sendMsg() {
Random random = new Random();
String mes = "消息:" + random.nextInt(10);
//构建correlationData 唯一标识,可以使用id做特殊处理
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
//开启确认模式
//rabbitTemplate.setConfirmCallback();
//开启消息投递监听
//rabbitTemplate.setReturnCallback();
rabbitTemplate.convertAndSend(DIRECT_EXCHANGE, DIRECT_QUEUE_KEY, mes, correlationData);
}
}
消费者
import com.rabbitmq.client.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class MyConsumer {
private static final Logger logger = LoggerFactory.getLogger(MyConsumer.class);
@RabbitListener(queues = {"myqueues"})
@RabbitHandler
public void consumerMsg(Message<String> message, Channel channel) throws IOException {
logger.info("消费消息:{}", message.getPayload());
}
}
Controller层
import com.wmj.service.MqSendService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
@RestController
@RequestMapping("/message")
public class ProducerController {
private Logger logger = LoggerFactory.getLogger(ProducerController.class);
@Resource
private MqSendService mqSendService;
@GetMapping("/sendMsg")
@ResponseBody
public String sendMsg() {
try {
mqSendService.sendMsg();
} catch (Exception e) {
logger.error("发送消息失败", e);
return "fail";
}
return "success";
}
}
启动服务,调用接口,可以看到随机生成的消息已经被消费者接收到。
curl -X GET http://localhost:8080/message/sendMsg
2022-07-10 11:35:23.758 INFO 6460 --- [ntContainer#0-1] com.wmj.service.MyConsumer : 消费消息:消息:2
2022-07-10 11:35:23.901 INFO 6460 --- [ntContainer#0-1] com.wmj.service.MyConsumer : 消费消息:消息:6
2022-07-10 11:35:24.108 INFO 6460 --- [ntContainer#0-1] com.wmj.service.MyConsumer : 消费消息:消息:7