fuliqi
2024-07-04 ae58bdb65b5c0f052801a291a7b48916bc2d5730
会议mq代码(待测试)
6个文件已修改
1个文件已添加
128 ■■■■ 已修改文件
src/main/java/com/ycl/jxkg/controller/admin/MeetController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/entity/Meet.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/rabbitmq/consumer/Consumer.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/rabbitmq/msg/MeetStatusMsg.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/rabbitmq/product/Producer.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/MeetService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/controller/admin/MeetController.java
@@ -43,7 +43,11 @@
    public Result update(@RequestBody @Validated(Update.class) MeetForm form) {
        return meetService.update(form);
    }
    @PutMapping("/start")
    @ApiOperation(value = "开始上课", notes = "开始上课")
    public Result start(@RequestBody @Validated(Update.class) MeetForm form) {
        return meetService.start(form);
    }
    @DeleteMapping("/{id}")
    @ApiOperation(value = "ID删除", notes = "ID删除")
    public Result removeById(@PathVariable("id") String id) {
src/main/java/com/ycl/jxkg/domain/entity/Meet.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.ycl.jxkg.domain.base.AbsEntity;
import lombok.Data;
@@ -47,4 +48,6 @@
    /** 状态 0/1/2 未开始/进行中/已结束 */
    private Integer status;
    @Version
    private Integer updateVersion;
}
src/main/java/com/ycl/jxkg/rabbitmq/consumer/Consumer.java
@@ -3,9 +3,12 @@
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.*;
@@ -22,7 +25,7 @@
public class Consumer {
    private final ExamMapper examMapper;
    private final MeetMapper meetMapper;
    /**
     * 考试状态更新的消费者
     *
@@ -50,6 +53,14 @@
     */
    @RabbitListener(queues = "meetDlxQueue")
    public void meetConsumer(Message message){
        System.out.println(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();
        }
    }
}
src/main/java/com/ycl/jxkg/rabbitmq/msg/MeetStatusMsg.java
New file
@@ -0,0 +1,26 @@
package com.ycl.jxkg.rabbitmq.msg;
import com.ycl.jxkg.enums.MeetStatusEnum;
import com.ycl.jxkg.enums.general.ExamStatusEnum;
import lombok.Data;
/**
 * @author:xp
 * @date:2024/7/1 14:15
 */
@Data
public class MeetStatusMsg extends MqMsg {
    /**
     * 会议ID
     *
     */
    private Integer meetId;
    /**
     * 这条消息希望将会议状态修改为哪个
     *
     */
    private Integer meetStatus;
}
src/main/java/com/ycl/jxkg/rabbitmq/product/Producer.java
@@ -37,8 +37,13 @@
        rabbitTemplate.convertAndSend("examExchange", "exam", message, msgCorrelationData);
    }
    public void meetMsg(Integer examId, String jsonMsg, Long delayTime) {
        rabbitTemplate.convertAndSend("examExchange","meet", "你好,RabbitMQ");
    public void meetMsg(Integer meetId, String jsonMsg, Long delayTime) {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration(delayTime + "");
        Message message = MessageBuilder.withBody(jsonMsg.getBytes()).andProperties(messageProperties).build();
        // 设置消息的关联数据,以便发送确认回调、未路由成功消息的处理
        MyCorrelationData msgCorrelationData = new MyCorrelationData(meetId + "", RabbitMqMsgTypeEnum.MEET);
        rabbitTemplate.convertAndSend("meetExchange", "meet", message, msgCorrelationData);
    }
}
src/main/java/com/ycl/jxkg/service/MeetService.java
@@ -64,4 +64,6 @@
    Result all();
    Result studentPage(MeetQuery query);
    Result start(MeetForm form);
}
src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java
@@ -1,30 +1,31 @@
package com.ycl.jxkg.service.impl;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.jxkg.base.Result;
import com.ycl.jxkg.base.SystemCode;
import com.ycl.jxkg.context.WebContext;
import com.ycl.jxkg.domain.entity.Meet;
import com.ycl.jxkg.domain.form.MeetForm;
import com.ycl.jxkg.domain.query.MeetQuery;
import com.ycl.jxkg.domain.vo.MeetVO;
import com.ycl.jxkg.enums.MeetStatusEnum;
import com.ycl.jxkg.mapper.ClassesUserMapper;
import com.ycl.jxkg.mapper.MeetMapper;
import com.ycl.jxkg.rabbitmq.msg.MeetStatusMsg;
import com.ycl.jxkg.rabbitmq.product.Producer;
import com.ycl.jxkg.service.MeetService;
import com.ycl.jxkg.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.jxkg.domain.form.MeetForm;
import com.ycl.jxkg.domain.vo.MeetVO;
import com.ycl.jxkg.domain.query.MeetQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import com.ycl.jxkg.utils.DateTimeUtil;
import com.ycl.jxkg.utils.PageUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -44,6 +45,7 @@
    private WebContext webContext;
    @Autowired
    private ClassesUserMapper classesUserMapper;
    private final Producer producer;
    /**
     * 添加
     * @param form
@@ -54,7 +56,11 @@
        Meet entity = MeetForm.getEntityByForm(form, null);
        entity.setStatus(MeetStatusEnum.Wait.getCode());
        entity.setCreateUser(webContext.getCurrentUser().getId());
        baseMapper.insert(entity);
        // 设置乐观锁版本
        entity.setUpdateVersion(0);
        if (baseMapper.insert(entity) > 0) {
            this.sendMQ(entity, 0);
        }
        return Result.ok("添加成功");
    }
@@ -70,7 +76,10 @@
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        baseMapper.updateById(entity);
        // 如果修改成功发送mq消息
        if (baseMapper.updateById(entity) > 0) {
            this.sendMQ(entity, entity.getUpdateVersion() + 1);
        }
        return Result.ok("修改成功");
    }
@@ -132,6 +141,19 @@
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    @Override
    public Result start(MeetForm form) {
        Meet entity = baseMapper.selectById(form.getId());
        // 为空抛IllegalArgumentException,做全局异常处理
        Assert.notNull(entity, "记录不存在");
        BeanUtils.copyProperties(form, entity);
        // 不使用updateById这种方式,避免乐观锁加一。
        new LambdaUpdateChainWrapper<>(meetMapper)
                .eq(Meet::getId, entity.getId())
                .update();
        return Result.ok();
    }
    /**
     * 根据id查找
     * @param id
@@ -160,4 +182,19 @@
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
    /**
     * 发送mq消息
     *
     * @param entity 考试实体类
     * @param version 乐观锁版本
     */
    public void sendMQ(Meet entity, Integer version) {
        MeetStatusMsg finishedMsg = new MeetStatusMsg();
        finishedMsg.setVersion(version);
        finishedMsg.setMeetId(entity.getId());
        finishedMsg.setMeetStatus(MeetStatusEnum.End.getCode());
        producer.meetMsg(entity.getId(), JSON.toJSONString(finishedMsg), DateTimeUtil.getTwoTimeDiffMS(entity.getEndTime(), new Date()));
    }
}