src/main/java/com/ycl/jxkg/controller/admin/MeetController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/domain/entity/Meet.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/rabbitmq/consumer/Consumer.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/rabbitmq/msg/MeetStatusMsg.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/rabbitmq/product/Producer.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/service/MeetService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ycl/jxkg/service/impl/MeetServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | 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())); } }