| | |
| | | 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(String message){ |
| | | System.out.println(message); |
| | | 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(String message){ |
| | | System.out.println(message); |
| | | 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(); |
| | | } |
| | | } |
| | | } |