package com.ycl.jxkg.rabbitmq.consumer; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.ycl.jxkg.domain.entity.Exam; import com.ycl.jxkg.domain.entity.Meet; import com.ycl.jxkg.enums.general.ExamStatusEnum; import com.ycl.jxkg.mapper.ExamMapper; import com.ycl.jxkg.mapper.MeetMapper; import com.ycl.jxkg.rabbitmq.msg.ExamStatusMsg; import com.ycl.jxkg.rabbitmq.msg.MeetStatusMsg; import lombok.RequiredArgsConstructor; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.*; import org.springframework.stereotype.Component; import java.util.Objects; /** * @author:xp * @date:2024/6/28 11:51 */ @Component @RequiredArgsConstructor public class Consumer { private final ExamMapper examMapper; private final MeetMapper meetMapper; /** * 考试状态更新的消费者 * * @param message */ @RabbitListener(queues = "examDlxQueue") public void examStatusAdjustConsumer(Message message){ ExamStatusMsg examStatusMsg = JSON.parseObject(message.getBody(), ExamStatusMsg.class); Exam exam = examMapper.selectById(examStatusMsg.getExamId()); if (Objects.nonNull(exam) && examStatusMsg.getVersion().equals(exam.getUpdateVersion())) { // 不使用updateById这种方式,避免乐观锁加一。 // 因为考试的状态修改一共需要发送两条消息。不能因为第一条消息改了之后,第二条消息因为乐观锁加一了而无法修改 new LambdaUpdateChainWrapper<>(examMapper) .eq(Exam::getId, exam.getId()) .eq(Exam::getStatus, ExamStatusEnum.ING.equals(examStatusMsg.getTargetStatus()) ? // 要改为进行中那么原本应该是未开始。结束则需要是进行中 ExamStatusEnum.NOT_START : ExamStatusEnum.FINISHED.equals(examStatusMsg.getTargetStatus()) ? ExamStatusEnum.ING : null) .set(Exam::getStatus, examStatusMsg.getTargetStatus()) .update(); } } /** * 会议消费者 * * @param message */ @RabbitListener(queues = "meetDlxQueue") public void meetConsumer(Message message){ MeetStatusMsg meetStatusMsg = JSON.parseObject(message.getBody(), MeetStatusMsg.class); Meet meet = meetMapper.selectById(meetStatusMsg.getMeetId()); if (Objects.nonNull(meet) && meetStatusMsg.getVersion().equals(meet.getUpdateVersion())) { // 不使用updateById这种方式,避免乐观锁加一。 new LambdaUpdateChainWrapper<>(meetMapper) .eq(Meet::getId, meet.getId()) .set(Meet::getStatus, meetStatusMsg.getMeetStatus()) .update(); } } }