xiangpei
2024-07-04 9784b6d36c189ea4b5df05a10cbba061d8b869c0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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();
        }
    }
}