SpringBoot-RabbitMQ的简单使用

首先就是依赖,这个是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();
            }
        }
    }
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值