首先就是依赖,这个是SpringBoot中为了能够更加方便的使用RabbitMQ,不用考虑连接、通道、交换器、队列等等。
<!-- rabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
如果使用amqp-client的话就需要手动编写很多代码了
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.0</version>
</dependency>
一般来说还是推荐使用第一个依赖
那配置文件中需要的配置就是以下这些
rabbitmq:
host: ruowu.com #IP地址 我这里是我自己配置的域名
port: 5672 #端口号
username: guest #用户名
password: guest #密码
listener: #监听器
direct:
acknowledge-mode: manual
simple:
acknowledge-mode: manual
如果你的端口号没有更改的话,就可以把port这一行省略,因为默认会使用5672这个端口号
username和password没有更改也可以省略,因为默认的是guest
至于监听器的话,默认的是auto自动确认,我这里是manual手动确认
自动确认是你从消息队列当中获取到消息之后就自动把这个消息标记成“等待确认”的状态
自动确认模式是没办法在消息异常或者没办法正常处理的情况下拒绝消息的,而手动模式就没有这个问题
手动模式就需要你在处理完消息之后确认消息或者拒绝
下面是一个使用RabbitMQ记录日志的基础使用
@Service
public class AuthServiceImpl implements AuthService {
@Autowired
private RabbitTemplate rabbitTemplate;
// 实现接口中的登录方法
@Override
public String login(ReqUser reqUser) {
// 创建一个登录记录实体类
LoginLog loginLog = new LoginLog();
// 设置登录时间为当前时间
loginLog.setLogTime(new Date());
// 设置登录日志的名称,包括用户名和操作类型
loginLog.setLogName("用户:" + reqUser.getUserName() + "->登录成功");
// 将登录日志发送到名为 "login_log" 的 RabbitMQ 队列中
rabbitTemplate.convertAndSend("login_log", (Object) JSONObject.toJSONString(loginLog), new MessagePostProcessor() {
// 创建一个消息后处理器(MessagePostProcessor)用于设置消息的 ID
@Override
public Message postProcessMessage(Message message) throws AmqpException {
// 设置消息 ID 为随机生成的 UUID
message.getMessageProperties().setMessageId(UUID.randomUUID().toString().replaceAll("-", ""));
return message;
}
});
// 返回登录成功的字符串
return "成功";
}
}
@Configuration
@Slf4j
public class AuthConfig {
@Autowired
private AuthMapper authMapper;
@Autowired
private RedisTemplate<String,String> redisTemplate;
// RabbitMQ 监听器,监听名为 "login_log" 的队列
@RabbitListener(queuesToDeclare = @Queue("login_log"))
public void addLoginLog(String msg, Message message, Channel channel){
// 打印日志,记录队列名称和消费内容
log.info("队列:[{}],消费内容:[{}],开始消费===>>>","login_log", msg);
try {
// 将消息 ID 添加到 Redis 集合中,以达到去重的目的
Long add = redisTemplate.opsForSet().add(message.getMessageProperties().getConsumerTag(), message.getMessageProperties().getMessageId());
if(add.intValue()==1){
// 解析 JSON 格式的日志信息,并插入数据库中
LoginLog loginLog = JSONObject.parseObject(msg, LoginLog.class);
authMapper.addLog(loginLog);
// 手动确认消息已被消费成功
channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
// 记录日志,标记消费成功
log.info("队列:[{}],消费内容:[{}],消费成功===>>>","login_log", msg);
}else{
// 记录日志,标记消费重复
log.info("队列:[{}],消费内容:[{}],消费重复===>>>","login_log", msg);
}
}catch (Exception ex){
ex.printStackTrace();
// 记录日志,标记消费异常
log.info("队列:[{}],消费内容:[{}],消费异常===>>>","login_log", msg);
try {
// 手动拒绝消息,并重新入队
channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
// 记录日志,标记消息已被退回
log.info("队列:[{}],消费内容:[{}],消费退回===>>>","login_log", msg);
}catch (Exception e){
e.printStackTrace();
}
}
}
}