This commit is contained in:
张良(004796)
2024-01-25 17:16:23 +08:00
parent 31036e69af
commit 7874e38d17
19 changed files with 326 additions and 415 deletions

View File

@@ -1,6 +1,9 @@
package com.ruoyi.cai.mq;
import com.alibaba.fastjson.JSON;
import com.ruoyi.cai.mq.config.RoomCheckDelayMqConfig;
import com.ruoyi.cai.mq.config.RoomSettleDelayMqConfig;
import com.ruoyi.cai.mq.config.CommonDelayMqConfig;
import com.ruoyi.cai.mq.consumer.CalculateSalesQueueConsumer;
import com.ruoyi.cai.mq.consumer.CommonConsumer;
import com.ruoyi.cai.mq.dto.CommonDTO;
@@ -24,9 +27,19 @@ public class AmqpProducer {
CommonConsumer.COMMON_KEY, JSON.toJSONString(dto));
}
public void sendCheckTimeOut(String message,Integer timeout){
rabbitTemplate.convertAndSend(CheckTimeOutMqConfig.EXCHANGE_NAME,
CheckTimeOutMqConfig.ROUTING_KEY,
public void sendRoomCheckDelay(String message, Integer timeout){
rabbitTemplate.convertAndSend(RoomCheckDelayMqConfig.EXCHANGE_NAME,
RoomCheckDelayMqConfig.ROUTING_KEY,
message,
messagePostProcessor -> {
messagePostProcessor.getMessageProperties().setDelay(timeout*1000); // 设置延迟时间,单位毫秒
return messagePostProcessor;
});
}
public void sendRoomSettleDelay(String message, Integer timeout){
rabbitTemplate.convertAndSend(RoomSettleDelayMqConfig.EXCHANGE_NAME,
RoomSettleDelayMqConfig.ROUTING_KEY,
message,
messagePostProcessor -> {
messagePostProcessor.getMessageProperties().setDelay(timeout*1000); // 设置延迟时间,单位毫秒
@@ -43,17 +56,4 @@ public class AmqpProducer {
return messagePostProcessor;
});
}
public void sendCommonDelayMq(Integer type,Long roomId,Integer timeout){
CommonDelayDto dto = new CommonDelayDto();
dto.setType(type);
dto.setRoomId(roomId);
rabbitTemplate.convertAndSend(CommonDelayMqConfig.EXCHANGE_NAME,
CommonDelayMqConfig.ROUTING_KEY,
JSON.toJSONString(dto),
messagePostProcessor -> {
messagePostProcessor.getMessageProperties().setDelay(timeout*1000); // 设置延迟时间,单位毫秒
return messagePostProcessor;
});
}
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.cai.mq;
import lombok.Getter;
@Getter
public enum CommonDelayTypeEnum {
USER_FORBID(1),
;
private final Integer code;
CommonDelayTypeEnum(Integer code) {
this.code = code;
}
}

View File

@@ -1,4 +1,4 @@
package com.ruoyi.cai.mq;
package com.ruoyi.cai.mq.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;

View File

@@ -1,4 +1,4 @@
package com.ruoyi.cai.mq;
package com.ruoyi.cai.mq.config;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;

View File

@@ -1,4 +1,4 @@
package com.ruoyi.cai.mq;
package com.ruoyi.cai.mq.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
@@ -8,11 +8,11 @@ import java.util.HashMap;
@Configuration
public class CheckTimeOutMqConfig {
public class RoomCheckDelayMqConfig {
public static final String EXCHANGE_NAME = "checkRoomTimeExchange";
public static final String QUEUE_NAME = "checkRoomTimeQueue";
public static final String ROUTING_KEY = "checkRoomTimeRouting";
public static final String EXCHANGE_NAME = "roomCheckDelayExchange";
public static final String QUEUE_NAME = "roomCheckDelayQueue";
public static final String ROUTING_KEY = "roomCheckDelayRouting";
@Bean
public CustomExchange delayedExchange() {

View File

@@ -0,0 +1,40 @@
package com.ruoyi.cai.mq.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
@Configuration
public class RoomSettleDelayMqConfig {
public static final String EXCHANGE_NAME = "roomSettleDelayExchange";
public static final String QUEUE_NAME = "roomSettleDelayQueue";
public static final String ROUTING_KEY = "roomSettleDelayRouting";
@Bean
public CustomExchange delayedExchange() {
HashMap<String,Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
return new CustomExchange(EXCHANGE_NAME,
"x-delayed-message", // 消息类型
true, // 是否持久化
false,// 是否自动删除
args);
}
@Bean
public Queue delayedQueue() {
return QueueBuilder.durable(QUEUE_NAME)
.withArgument("x-delayed-type", "direct")
.build();
}
@Bean
public Binding delayedBinding(Queue delayedQueue,CustomExchange delayedExchange) {
return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(ROUTING_KEY).noargs();
}
}

View File

@@ -2,9 +2,9 @@ package com.ruoyi.cai.mq.consumer;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.cai.manager.UserForbidManager;
import com.ruoyi.cai.mq.CommonDelayTypeEnum;
import com.ruoyi.cai.mq.config.CommonDelayMqConfig;
import com.ruoyi.cai.mq.dto.CommonDelayDto;
import com.ruoyi.cai.mq.CommonDelayMqConfig;
import com.ruoyi.cai.ws.job.CheckTimeOutJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
@@ -13,8 +13,6 @@ import org.springframework.stereotype.Component;
@Slf4j
@Component
public class CommonDelayMqConsumer {
@Autowired
private CheckTimeOutJob checkTimeOutJob;
@Autowired
private UserForbidManager userForbidManager;
@@ -23,12 +21,18 @@ public class CommonDelayMqConsumer {
public void checkTimeOutMq(String message) {
log.info("CommonDelayMqConsumer: " + message);
CommonDelayDto dto = JSON.parseObject(message, CommonDelayDto.class);
switch (dto.getType()){
case 1:
checkTimeOutJob.deal(dto.getRoomId());
break;
case 2:
userForbidManager.checkAll();
CommonDelayTypeEnum typeEnum = dto.getTypeEnum();
if(typeEnum == null){
log.warn("延时任务执行失败,未检测到正确的类型 dto={}",JSON.toJSONString(dto));
return;
}
switch (typeEnum){
case USER_FORBID:
try {
userForbidManager.checkExpire(dto.getForbidId());
}catch (Exception e){
log.error("检查用户封禁状态失败!需要开发确认!",e);
}
break;
default:
break;

View File

@@ -0,0 +1,36 @@
package com.ruoyi.cai.mq.consumer;
import com.ruoyi.cai.mq.AmqpProducer;
import com.ruoyi.cai.mq.config.RoomCheckDelayMqConfig;
import com.ruoyi.cai.ws.job.JobResp;
import com.ruoyi.cai.ws.job.RoomCheckJobService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class RoomCheckDelayMqConsumer {
@Autowired
private AmqpProducer amqpProducer;
@Autowired
private RoomCheckJobService roomCheckJobService;
@RabbitListener(queues = RoomCheckDelayMqConfig.QUEUE_NAME
,containerFactory = "customContainerFactory")
public void sendRoomCheck(String roomIdStr) {
log.info("开始执行房间检测: roomId={}",roomIdStr);
try {
Long roomId = Long.valueOf(roomIdStr);
JobResp resp = roomCheckJobService.checkRoom(roomId);
if(resp.isNextCreateJob()){
// 1分钟后继续执行
amqpProducer.sendRoomCheckDelay(roomIdStr,60);
}
}catch (Exception e){
log.error("每分钟定时检测房间失败! roomId={}",roomIdStr);
}
}
}

View File

@@ -1,23 +1,22 @@
package com.ruoyi.cai.mq.consumer;
import com.ruoyi.cai.mq.AmqpProducer;
import com.ruoyi.cai.mq.CheckTimeOutMqConfig;
import com.ruoyi.cai.mq.config.RoomSettleDelayMqConfig;
import com.ruoyi.cai.ws.service.SettleService;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.index.qual.SameLen;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class CheckTimeOutMqConsumer {
public class RoomSettleDelayMqConsumer {
@Autowired
private SettleService settleService;
@Autowired
private AmqpProducer amqpProducer;
@RabbitListener(queues = CheckTimeOutMqConfig.QUEUE_NAME
@RabbitListener(queues = RoomSettleDelayMqConfig.QUEUE_NAME
,containerFactory = "customContainerFactory")
public void checkTimeOutMq(String message) {
log.info("开始执行预扣费: " + message);
@@ -25,7 +24,7 @@ public class CheckTimeOutMqConsumer {
boolean next = settleService.withholdingFee(Long.valueOf(message));
if(next){
// 1分钟后继续执行
amqpProducer.sendCheckTimeOut(message,60);
amqpProducer.sendRoomSettleDelay(message,60);
}
}catch (Exception e){
log.error("每分钟定时扣费失败!",e);

View File

@@ -1,11 +1,23 @@
package com.ruoyi.cai.mq.dto;
import com.ruoyi.cai.mq.CommonDelayTypeEnum;
import lombok.Data;
@Data
public class CommonDelayDto {
// 1- 房间检测 2-黑名单检测
/**
* @see com.ruoyi.cai.mq.CommonDelayTypeEnum
*/
private Integer type;
private Long roomId;
private Long forbidId;
public CommonDelayTypeEnum getTypeEnum(){
CommonDelayTypeEnum[] values = CommonDelayTypeEnum.values();
for (CommonDelayTypeEnum value : values) {
if(value.getCode().equals(this.type)){
return value;
}
}
return null;
}
}