主要完善延时任务相关,缺失的注释信息,log记录的信息完善。目录结构优化。

sql数据过大,展示sql默认为false,需要打开手动打开就好。
This commit is contained in:
Chopper 2021-06-08 18:40:32 +08:00
parent 91baf22841
commit da1863850a
29 changed files with 151 additions and 84 deletions

View File

@ -127,7 +127,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
show: false
# 忽略TOKEN 鉴权 的url
ignored:

View File

@ -124,7 +124,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
show: false
# 忽略鉴权url
ignored:

View File

@ -124,7 +124,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
show: false
# 忽略鉴权url
ignored:

View File

@ -124,7 +124,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
show: false
# 忽略鉴权url
ignored:

View File

@ -1,8 +1,8 @@
package cn.lili.trigger.executor;
import cn.hutool.json.JSONUtil;
import cn.lili.common.delayqueue.PintuanOrderMessage;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.message.PintuanOrderMessage;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.interfaces.TimeTriggerExecutor;
import cn.lili.common.trigger.model.TimeExecuteConstant;

View File

@ -124,7 +124,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
show: false
# 忽略鉴权url
ignored:

View File

@ -232,4 +232,35 @@ public interface Cache<T> {
* @return
*/
Set<ZSetOperations.TypedTuple<Object>> reverseRangeWithScores(String sortedSetName, Integer start, Integer end);
/**
* 向Zset里添加成员
*
* @param key key值
* @param score 分数
* @param value
* @return 增加状态
*/
boolean zAdd(String key, long score, String value);
/**
* 获取 某key 某一分值区间的队列
*
* @param key 缓存key
* @param from 开始时间
* @param to 结束时间
* @return 数据
*/
Set<ZSetOperations.TypedTuple<Object>> zRangeByScore(String key, int from, long to);
/**
* 移除 Zset队列值
*
* @param key key值
* @param value 删除的集合
* @return 删除数量
*/
Long zRemove(String key, String... value);
}

View File

@ -240,4 +240,47 @@ public class RedisCache implements Cache {
public Set<ZSetOperations.TypedTuple<Object>> reverseRangeWithScores(String sortedSetName, Integer start, Integer end) {
return this.redisTemplate.opsForZSet().reverseRangeWithScores(sortedSetName, start, end);
}
/**
* 向Zset里添加成员
*
* @param key key值
* @param score 分数通常用于排序
* @param value
* @return 增加状态
*/
@Override
public boolean zAdd(String key, long score, String value) {
Boolean result = redisTemplate.opsForZSet().add(key, value, score);
return result;
}
/**
* 获取 某key 某一分值区间的队列
*
* @param key 缓存key
* @param from 开始时间
* @param to 结束时间
* @return 数据
*/
@Override
public Set<ZSetOperations.TypedTuple<Object>> zRangeByScore(String key, int from, long to) {
Set<ZSetOperations.TypedTuple<Object>> set = redisTemplate.opsForZSet().rangeByScoreWithScores(key, from, to);
return set;
}
/**
* 移除 Zset队列值
*
* @param key key值
* @param value 删除的集合
* @return 删除数量
*/
@Override
public Long zRemove(String key, String... value) {
return redisTemplate.opsForZSet().remove(key, value);
}
}

View File

@ -17,6 +17,8 @@ import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
/**
* 延时任务实现
*
* @author paulG
* @since 2020/11/5
**/
@ -32,8 +34,23 @@ public class RocketmqTimerTrigger implements TimeTrigger {
@Override
public void add(String executorName, Object param, Long triggerTime, String uniqueKey, String topic) {
public void add(TimeTriggerMsg timeTriggerMsg) {
this.addExecute(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getParam(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey(), timeTriggerMsg.getTopic());
}
/**
* 添加延时任务
*
* @param executorName 执行器beanId
* @param param 执行参数
* @param triggerTime 执行时间 时间戳 秒为单位
* @param uniqueKey 如果是一个 需要有 修改/取消 延时任务功能的延时任务<br/>
* 请填写此参数作为后续删除修改做为唯一凭证 <br/>
* 建议参数为COUPON_{ACTIVITY_ID} 例如 coupon_123<br/>
* 业务内全局唯一
* @param topic rocketmq topic
*/
public void addExecute(String executorName, Object param, Long triggerTime, String uniqueKey, String topic) {
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(executorName, triggerTime, param, uniqueKey, topic);
Message<TimeTriggerMsg> message = MessageBuilder.withPayload(timeTriggerMsg).build();
@ -41,13 +58,9 @@ public class RocketmqTimerTrigger implements TimeTrigger {
this.rocketMQTemplate.asyncSend(topic, message, RocketmqSendCallbackBuilder.commonCallback());
}
@Override
public void add(TimeTriggerMsg timeTriggerMsg) {
this.add(timeTriggerMsg.getTriggerExecutor(), timeTriggerMsg.getParam(), timeTriggerMsg.getTriggerTime(), timeTriggerMsg.getUniqueKey(), timeTriggerMsg.getTopic());
}
@Override
public void addDelay(TimeTriggerMsg timeTriggerMsg, int delayTime) {
//执行器唯一key
String uniqueKey = timeTriggerMsg.getUniqueKey();
if (StringUtils.isEmpty(uniqueKey)) {
uniqueKey = StringUtils.getRandStr(10);
@ -73,7 +86,7 @@ public class RocketmqTimerTrigger implements TimeTrigger {
@Override
public void delete(String executorName, Long triggerTime, String uniqueKey, String topic) {
String generateKey = TimeTriggerUtil.generateKey(executorName, triggerTime, uniqueKey);
log.info("delete redis key {} -----------------------", generateKey);
log.info("删除延时任务{}", generateKey);
this.cache.remove(generateKey);
}
}

View File

@ -1,6 +1,7 @@
package cn.lili.common.delayqueue;
package cn.lili.common.trigger.delay;
import cn.lili.common.utils.RedisUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.cache.Cache;
import cn.lili.common.utils.ThreadPoolUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -22,7 +23,7 @@ import java.util.concurrent.TimeUnit;
public abstract class AbstractDelayQueueMachineFactory {
@Autowired
private RedisUtil redisUtil;
private Cache cache;
/**
* 插入任务id
@ -35,8 +36,8 @@ public abstract class AbstractDelayQueueMachineFactory {
Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND, time);
long delaySeconds = instance.getTimeInMillis() / 1000;
boolean result = redisUtil.zadd(setDelayQueueName(), delaySeconds, jobId);
log.info("redis add delay, key {}, delay time {}", setDelayQueueName(), time);
boolean result = cache.zAdd(setDelayQueueName(), delaySeconds, jobId);
log.info("增加延时任务, 缓存key {}, 等待时间 {}", setDelayQueueName(), time);
return result;
}
@ -45,21 +46,24 @@ public abstract class AbstractDelayQueueMachineFactory {
* 延时队列机器开始运作
*/
private void startDelayQueueMachine() {
log.info(String.format("延时队列机器{%s}开始运作", setDelayQueueName()));
log.info("延时队列机器{}开始运作", setDelayQueueName());
// 发生异常捕获并且继续不能让战斗停下来
// 监听redis队列
while (true) {
try {
// 获取当前时间的时间戳
long now = System.currentTimeMillis() / 1000;
// 获取当前时间前的任务列表
Set<DefaultTypedTuple> tuples = redisUtil.zrangeByScoreWithScores(setDelayQueueName(), 0, now);
// 如果不为空则遍历判断其是否满足取消要求
if (!CollectionUtils.isEmpty(tuples)) {
for (DefaultTypedTuple tuple : tuples) {
Set<DefaultTypedTuple> tuples = cache.zRangeByScore(setDelayQueueName(), 0, now);
// 如果任务不为空
if (!CollectionUtils.isEmpty(tuples)) {
log.info("执行任务:{}", JSONUtil.toJsonStr(tuples));
for (DefaultTypedTuple tuple : tuples) {
String jobId = (String) tuple.getValue();
Long num = redisUtil.zremove(setDelayQueueName(), jobId);
// 移除缓存如果移除成功则表示当前线程处理了延时任务则执行延时任务
Long num = cache.zRemove(setDelayQueueName(), jobId);
// 如果移除成功, 则执行
if (num > 0) {
ThreadPoolUtil.execute(() -> invoke(jobId));
@ -68,7 +72,7 @@ public abstract class AbstractDelayQueueMachineFactory {
}
} catch (Exception e) {
log.error(String.format("处理延时任务发生异常,异常原因为{%s}", e.getMessage()), e);
log.error("处理延时任务发生异常,异常原因为{}", e.getMessage(), e);
} finally {
// 间隔一秒钟搞一次
try {

View File

@ -1,7 +1,6 @@
package cn.lili.common.trigger.delay;
import cn.hutool.json.JSONUtil;
import cn.lili.common.delayqueue.AbstractDelayQueueMachineFactory;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeTriggerMsg;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,4 +1,4 @@
package cn.lili.common.delayqueue;
package cn.lili.common.trigger.enums;
/**
* 延时任务类型

View File

@ -9,19 +9,6 @@ import cn.lili.common.trigger.model.TimeTriggerMsg;
*/
public interface TimeTrigger {
/**
* 添加延时任务
*
* @param executorName 执行器beanId
* @param param 执行参数
* @param triggerTime 执行时间 时间戳 秒为单位
* @param uniqueKey 如果是一个 需要有 修改/取消 延时任务功能的延时任务<br/>
* 请填写此参数作为后续删除修改做为唯一凭证 <br/>
* 建议参数为COUPON_{ACTIVITY_ID} 例如 coupon_123<br/>
* 业务内全局唯一
* @param topic rocketmq topic
*/
void add(String executorName, Object param, Long triggerTime, String uniqueKey, String topic);
/**
* 添加延时任务

View File

@ -2,14 +2,15 @@ package cn.lili.common.trigger.interfaces;
/**
* 延时任务执行器接口
* @author Chopper
*
* @author Chopper
*/
public interface TimeTriggerExecutor {
/**
* 执行任务
*
* @param object 任务参数
*/
void execute(Object object);

View File

@ -1,4 +1,4 @@
package cn.lili.common.delayqueue;
package cn.lili.common.trigger.message;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package cn.lili.common.delayqueue;
package cn.lili.common.trigger.message;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;

View File

@ -1,6 +1,8 @@
package cn.lili.common.trigger.model;
/**
* 延时任务执行器常量
*
* @author paulG
* @since 2020/8/20
**/
@ -11,14 +13,4 @@ public abstract class TimeExecuteConstant {
*/
public static final String PROMOTION_EXECUTOR = "promotionTimeTriggerExecutor";
/**
* 拼团延迟加载执行器
*/
public static final String PINTUAN_EXECUTOR = "pintuanTimeTriggerExecutor";
/**
* 拼团延迟加载执行器
*/
public static final String FULL_DISCOUNT_EXECUTOR = "fullDiscountTimeTriggerExecutor";
}

View File

@ -1,4 +1,6 @@
package cn.lili.common.delayqueue;
package cn.lili.common.trigger.util;
import cn.lili.common.trigger.enums.DelayQueueType;
/**
* 延时任务工具类

View File

@ -4,26 +4,22 @@ import cn.lili.base.BaseEntity;
import cn.lili.modules.base.entity.enums.ClientTypeEnum;
import cn.lili.modules.order.order.entity.enums.OrderTypeEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
* 订单
* 订单支付日志实际为订单部分字段提取过来的一个vo
*
* @author Chopper
* @date 2020/11/17 7:30 下午
*/
@Data
@Entity
@Table(name = "li_order")
@TableName("li_order")
@ApiModel(value = "订单")
public class PaymentLog extends BaseEntity {

View File

@ -5,9 +5,9 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.aop.syslog.annotation.SystemLogPoint;
import cn.lili.common.delayqueue.DelayQueueTools;
import cn.lili.common.delayqueue.DelayQueueType;
import cn.lili.common.delayqueue.PintuanOrderMessage;
import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType;
import cn.lili.common.trigger.message.PintuanOrderMessage;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.rocketmq.RocketmqSendCallbackBuilder;

View File

@ -1,6 +1,6 @@
package cn.lili.modules.promotion.service;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import java.util.Map;

View File

@ -1,9 +1,9 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.delayqueue.DelayQueueTools;
import cn.lili.common.delayqueue.DelayQueueType;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeExecuteConstant;

View File

@ -1,8 +1,8 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.delayqueue.DelayQueueTools;
import cn.lili.common.delayqueue.DelayQueueType;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeExecuteConstant;
@ -27,7 +27,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;

View File

@ -1,9 +1,9 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.bean.BeanUtil;
import cn.lili.common.delayqueue.DelayQueueTools;
import cn.lili.common.delayqueue.DelayQueueType;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeExecuteConstant;

View File

@ -1,9 +1,9 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.util.StrUtil;
import cn.lili.common.delayqueue.DelayQueueTools;
import cn.lili.common.delayqueue.DelayQueueType;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeExecuteConstant;

View File

@ -3,7 +3,7 @@ package cn.lili.modules.promotion.serviceimpl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.DateUtil;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;

View File

@ -1,8 +1,8 @@
package cn.lili.modules.promotion.serviceimpl;
import cn.lili.common.delayqueue.DelayQueueTools;
import cn.lili.common.delayqueue.DelayQueueType;
import cn.lili.common.delayqueue.PromotionMessage;
import cn.lili.common.trigger.util.DelayQueueTools;
import cn.lili.common.trigger.enums.DelayQueueType;
import cn.lili.common.trigger.message.PromotionMessage;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.trigger.interfaces.TimeTrigger;
import cn.lili.common.trigger.model.TimeExecuteConstant;

View File

@ -124,7 +124,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
show: false
# 忽略鉴权url
ignored:

View File

@ -124,7 +124,7 @@ spring:
props:
#是否打印逻辑SQL语句和实际SQL语句建议调试时打印在生产环境关闭
sql:
show: true
show: false
# 忽略鉴权url
ignored: