This commit is contained in:
张良(004796)
2024-01-19 19:11:18 +08:00
parent 87ed8dbfa7
commit f759a2e45f
6 changed files with 124 additions and 3 deletions

View File

@@ -0,0 +1,28 @@
package com.ruoyi.cai.job;
import com.ruoyi.cai.manager.UserForbidManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class ForbidJob {
@Autowired
private UserForbidManager userForbidManager;
/**
* 每12小时执行一次
*/
@Scheduled(cron = "0 0 11,23 * * ? ")
public void checkForbid(){
try {
userForbidManager.checkAll();
}catch (Exception e){
log.error("黑名单失效检测失败!",e);
}
}
}

View File

@@ -2,12 +2,14 @@ package com.ruoyi.cai.manager;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.rabbitmq.client.LongString; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.*; import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.dto.admin.UserForbidDTO; import com.ruoyi.cai.dto.admin.UserForbidDTO;
import com.ruoyi.cai.dto.admin.query.UserForbidReq; import com.ruoyi.cai.dto.admin.query.UserForbidReq;
import com.ruoyi.cai.enums.ForbidTimeEnum; import com.ruoyi.cai.enums.ForbidTimeEnum;
import com.ruoyi.cai.enums.ForbidTypeEnum; import com.ruoyi.cai.enums.ForbidTypeEnum;
import com.ruoyi.cai.mq.AmqpProducer;
import com.ruoyi.cai.mq.CommonDelayDto;
import com.ruoyi.cai.service.*; import com.ruoyi.cai.service.*;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import lombok.Data; import lombok.Data;
@@ -17,6 +19,9 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Component @Component
@@ -159,6 +164,63 @@ public class UserForbidManager {
forbidCache.unForbid(type,member); forbidCache.unForbid(type,member);
} }
public void checkAll(){
List<Long> expireIds = new ArrayList<>();
List<Long> expireConsumer = new ArrayList<>();
Page<UserForbid> page = new Page<>();
page.setSize(100L);
long current = 0;
while (true){
current++;
page.setCurrent(current);
Page<UserForbid> res = userForbidService.page(page,Wrappers.lambdaQuery(UserForbid.class)
.eq(UserForbid::getForbidStatus,1));
List<UserForbid> records = res.getRecords();
if(records.isEmpty()){
break;
}
for (UserForbid record : records) {
if(record.getEndTime().isAfter(LocalDateTime.now())){
expireIds.add(record.getId());
}else if(record.getEndTime().plusHours(12).isAfter(LocalDateTime.now())){ // 还有12小时过期
expireConsumer.add(record.getId());
}
}
}
for (Long expireId : expireIds) {
checkExpire(expireId);
}
for (Long expireId : expireConsumer) {
UserForbid userForbid = userForbidService.getById(expireId);
if(userForbid == null || userForbid.getForbidStatus() == 2){
return;
}
// 后者 - 前者 < 12小时
long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), userForbid.getEndTime());
if(between > 0 && between < 60*60*12){
CommonDelayDto dto = new CommonDelayDto();
dto.setForbidId(expireId);
dto.setType(2);
amqpProducer.sendCommonDelayMq(dto,(int)between+5);
}
}
}
@Autowired
private AmqpProducer amqpProducer;
public void checkExpire(Long id){
UserForbid userForbid = userForbidService.getById(id);
if(userForbid == null || userForbid.getForbidStatus() == 2){
return;
}
if(!userForbid.getEndTime().isAfter(LocalDateTime.now())){
return;
}
this.unForbidByForbidId(id);
}
@Data @Data
public static class CheckForbid implements Serializable { public static class CheckForbid implements Serializable {
// 是否已经被封禁 // 是否已经被封禁

View File

@@ -25,6 +25,16 @@ public class AmqpProducer {
}); });
} }
public void sendCommonDelayMq(CommonDelayDto dto,Integer timeout){
rabbitTemplate.convertAndSend(CommonDelayMqConfig.EXCHANGE_NAME,
CommonDelayMqConfig.ROUTING_KEY,
JSON.toJSONString(dto),
messagePostProcessor -> {
messagePostProcessor.getMessageProperties().setDelay(timeout*1000); // 设置延迟时间,单位毫秒
return messagePostProcessor;
});
}
public void sendCommonDelayMq(Integer type,Long roomId,Integer timeout){ public void sendCommonDelayMq(Integer type,Long roomId,Integer timeout){
CommonDelayDto dto = new CommonDelayDto(); CommonDelayDto dto = new CommonDelayDto();
dto.setType(type); dto.setType(type);

View File

@@ -4,6 +4,8 @@ import lombok.Data;
@Data @Data
public class CommonDelayDto { public class CommonDelayDto {
// 1- 房间检测 2-黑名单检测
private Integer type; private Integer type;
private Long roomId; private Long roomId;
private Long forbidId;
} }

View File

@@ -1,6 +1,7 @@
package com.ruoyi.cai.mq.consumer; package com.ruoyi.cai.mq.consumer;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.ruoyi.cai.manager.UserForbidManager;
import com.ruoyi.cai.mq.AmqpProducer; import com.ruoyi.cai.mq.AmqpProducer;
import com.ruoyi.cai.mq.CommonDelayDto; import com.ruoyi.cai.mq.CommonDelayDto;
import com.ruoyi.cai.mq.CommonDelayMqConfig; import com.ruoyi.cai.mq.CommonDelayMqConfig;
@@ -16,7 +17,7 @@ public class CommonDelayMqConsumer {
@Autowired @Autowired
private CheckTimeOutJob checkTimeOutJob; private CheckTimeOutJob checkTimeOutJob;
@Autowired @Autowired
private AmqpProducer amqpProducer; private UserForbidManager userForbidManager;
@RabbitListener(queues = CommonDelayMqConfig.QUEUE_NAME @RabbitListener(queues = CommonDelayMqConfig.QUEUE_NAME
,containerFactory = "customContainerFactory") ,containerFactory = "customContainerFactory")
@@ -27,6 +28,9 @@ public class CommonDelayMqConsumer {
case 1: case 1:
checkTimeOutJob.deal(dto.getRoomId()); checkTimeOutJob.deal(dto.getRoomId());
break; break;
case 2:
userForbidManager.checkAll();
break;
default: default:
break; break;
} }

View File

@@ -8,12 +8,13 @@ import com.ruoyi.cai.domain.Anchor;
import com.ruoyi.cai.domain.User; import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.domain.UserForbid; import com.ruoyi.cai.domain.UserForbid;
import com.ruoyi.cai.domain.UserForbidLog; import com.ruoyi.cai.domain.UserForbidLog;
import com.ruoyi.cai.dto.admin.query.UserForbidReq;
import com.ruoyi.cai.dto.admin.vo.UserForbidAdminVo; import com.ruoyi.cai.dto.admin.vo.UserForbidAdminVo;
import com.ruoyi.cai.enums.ForbidTimeEnum; import com.ruoyi.cai.enums.ForbidTimeEnum;
import com.ruoyi.cai.enums.ForbidTypeEnum; import com.ruoyi.cai.enums.ForbidTypeEnum;
import com.ruoyi.cai.manager.ForbidCache; import com.ruoyi.cai.manager.ForbidCache;
import com.ruoyi.cai.mapper.UserForbidMapper; import com.ruoyi.cai.mapper.UserForbidMapper;
import com.ruoyi.cai.mq.AmqpProducer;
import com.ruoyi.cai.mq.CommonDelayDto;
import com.ruoyi.cai.service.AnchorService; import com.ruoyi.cai.service.AnchorService;
import com.ruoyi.cai.service.UserForbidService; import com.ruoyi.cai.service.UserForbidService;
import com.ruoyi.cai.service.UserService; import com.ruoyi.cai.service.UserService;
@@ -23,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
/** /**
* 封号列表Service业务层处理 * 封号列表Service业务层处理
@@ -40,6 +42,8 @@ public class UserForbidServiceImpl extends ServiceImpl<UserForbidMapper, UserFor
private AnchorService anchorService; private AnchorService anchorService;
@Autowired @Autowired
private ForbidCache forbidCache; private ForbidCache forbidCache;
@Autowired
private AmqpProducer amqpProducer;
@Override @Override
public void forbid(UserForbidLog userForbidLog, User user) { public void forbid(UserForbidLog userForbidLog, User user) {
@@ -75,6 +79,17 @@ public class UserForbidServiceImpl extends ServiceImpl<UserForbidMapper, UserFor
anchorService.update(Wrappers.lambdaUpdate(Anchor.class).eq(Anchor::getId,user.getId()).set(Anchor::getStatus,1)); anchorService.update(Wrappers.lambdaUpdate(Anchor.class).eq(Anchor::getId,user.getId()).set(Anchor::getStatus,1));
} }
forbidCache.addForbid(one); forbidCache.addForbid(one);
try {
// 后者 - 前者 < 12小时
long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), endTime);
CommonDelayDto dto = new CommonDelayDto();
dto.setForbidId(one.getId());
dto.setType(2);
amqpProducer.sendCommonDelayMq(dto,(int)between+2);
}catch (Exception e){
log.error("延时任务发送失败!");
}
} }
@Override @Override