定时任务参数配置化

This commit is contained in:
zhaoyong_sh 2021-05-19 17:59:57 +08:00
parent 0cbfc146bc
commit 43c803080f
6 changed files with 296 additions and 1 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.axzo.framework</groupId>
<artifactId>common-common</artifactId>
<version>1.0.2</version>
<version>1.0.3</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@ -18,6 +18,9 @@
<slf4j-api.version>1.7.5</slf4j-api.version>
<lombok.version>1.18.18</lombok.version>
<fastjson.version>1.2.47</fastjson.version>
<joda-time.version>2.10.6</joda-time.version>
<hutool-all.version>5.5.7</hutool-all.version>
<jackson-databind.version>2.10.2</jackson-databind.version>
<apm-toolkit-trace.version>6.5.0</apm-toolkit-trace.version>
<javax.servlet-api.version>3.0.1</javax.servlet-api.version>
<spring-context.version>4.3.19.RELEASE</spring-context.version>
@ -56,18 +59,35 @@
<version>${hibernate.validator.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool-all.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-context.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>

View File

@ -22,4 +22,16 @@ public class Constants {
/** 心跳 URI */
public static final String HEARTBEAT_URI = "/checkDeath";
/** 秒 */
public static final String SECONDS = "SECONDS";
/** 分钟 */
public static final String MINUTES = "MINUTES";
/** 小时 */
public static final String HOURS = "HOURS";
/** 天 */
public static final String DAYS = "DAYS";
}

View File

@ -0,0 +1,25 @@
package cn.azxo.framework.common.model;
import lombok.Data;
import java.util.Date;
/**
* 分页查询
*
* @author zhaoyong_sh
* @see JobPageRequest
* @since 2021-05-19 16:11
*/
@Data
public class JobPageRequest {
private String referenceNo;
private int pageSize;
private Date startTime;
private Date endTime;
}

View File

@ -0,0 +1,39 @@
package cn.azxo.framework.common.model;
import lombok.Data;
/**
* 定时任务参数模型
*
* @author zhaoyong_sh
* @see JobParamModel
* @since 2021-05-19 15:57
*/
@Data
public class JobParamModel {
/** 引用号,订单领域可以理解为订单号 */
private String referenceNo;
/** 基准时间(结束时间) yyyy-MM-dd HH:mm:ss */
private String basicTime;
/** 向前偏移量 */
private Integer forwardOffset;
/** 向前偏移单位 */
private String forwardOffsetUnit;
/** 向后偏移量 */
private Integer backwardOffset;
/** 向后偏移单位 */
private String backwardOffsetUnit;
/** 是否为全闭区间时间段 */
private boolean wholeClosedRange;
/** 分页数 */
private int pageSize = 500;
}

View File

@ -0,0 +1,142 @@
package cn.azxo.framework.common.service;
import cn.azxo.framework.common.constatns.Constants;
import cn.azxo.framework.common.model.JobPageRequest;
import cn.azxo.framework.common.model.JobParamModel;
import cn.azxo.framework.common.utils.DateUtils;
import cn.azxo.framework.common.utils.StringUtils;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 定时任务参数解析器
*
* @author zhaoyong_sh
* @see JobParamResolver
* @since 2021-05-19 16:29
*/
public class JobParamResolver {
private final static ObjectMapper objectMapper = new ObjectMapper();
private static final Map<String, DateField> dateFieldMap = new HashMap<>();
static {
dateFieldMap.put(Constants.SECONDS, DateField.SECOND);
dateFieldMap.put(Constants.MINUTES, DateField.MINUTE);
dateFieldMap.put(Constants.HOURS, DateField.HOUR_OF_DAY);
dateFieldMap.put(Constants.DAYS, DateField.DAY_OF_YEAR);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public JobPageRequest resolver(String param) {
JobParamModel paramModel = getJobParamModel(param);
JobPageRequest request = new JobPageRequest();
if(StringUtils.isNotBlank(paramModel.getReferenceNo())){
request.setReferenceNo(paramModel.getReferenceNo());
return request;
}
// 获取基准时间
Date basicTime = getBasicTime(paramModel);
// 获取开始时间
Date startTime = getStartTime(basicTime, paramModel);
// 获取结束时间
Date endTime = getEndTime(basicTime, paramModel);
// 设置开始与结束时间
if(paramModel.isWholeClosedRange()) {
request.setStartTime(DateUtil.beginOfDay(startTime));
request.setEndTime(DateUtil.endOfDay(endTime));
} else {
request.setStartTime(startTime);
request.setEndTime(endTime);
}
// 设置查询页大小
request.setPageSize(paramModel.getPageSize());
return request;
}
/**
* 获取
* @param param
* @return
*/
private JobParamModel getJobParamModel(String param){
if(StringUtils.isBlank(param)){
return new JobParamModel();
}
try {
return objectMapper.readValue(param, JobParamModel.class);
} catch (Exception e) {
return new JobParamModel();
}
}
/**
* 获取基准时间
* @param paramModel
* @return
*/
private Date getBasicTime(JobParamModel paramModel) {
String basicTime = paramModel.getBasicTime();
if(StringUtils.isBlank(basicTime)) {
return new Date();
}
try {
return DateUtils.parseY14S(paramModel.getBasicTime());
} catch (Exception e) {
return new Date();
}
}
/**
* 获取开始时间
* @param basicTime
* @param paramModel
* @return
*/
private Date getStartTime(Date basicTime, JobParamModel paramModel) {
Date oneDayBefore = DateUtils.plusHour(basicTime, -24);
Integer forwardOffset = paramModel.getForwardOffset();
if(forwardOffset == null) {
return oneDayBefore;
}
String forwardOffsetUnit = paramModel.getForwardOffsetUnit();
DateField dateField = dateFieldMap.get(forwardOffsetUnit);
if(dateField == null) {
return oneDayBefore;
}
return DateUtil.offset(basicTime, dateField, -forwardOffset);
}
/**
* 获取结束时间
* @param basicTime
* @param paramModel
* @return
*/
private Date getEndTime(Date basicTime, JobParamModel paramModel) {
Integer backwardOffset = paramModel.getBackwardOffset();
if(backwardOffset == null) {
return basicTime;
}
String backwardOffsetUnit = paramModel.getBackwardOffsetUnit();
DateField dateField = dateFieldMap.get(backwardOffsetUnit);
if(dateField == null) {
return basicTime;
}
return DateUtil.offset(basicTime, dateField, backwardOffset);
}
}

View File

@ -0,0 +1,57 @@
package cn.azxo.framework.common.utils;
import org.joda.time.DateTime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期处理类
*
* @author zhaoyong_sh
* @see DateUtils
* @since 2021-04-01 14:20
*/
public abstract class DateUtils {
public static final String STANDARD_TIME = "yyyy-MM-dd HH:mm:ss";
/**
* 当前时间添加小时
* @param hour
* @return
*/
public static Date plusHour(int hour) {
DateTime dateTime = DateTime.now();
DateTime afterPlus = dateTime.plusHours(hour);
return afterPlus.toDate();
}
/**
* 指定时间添加小时
* @param date
* @param hour
* @return
*/
public static Date plusHour(Date date, int hour) {
DateTime dateTime = new DateTime(date);
DateTime afterPlus = dateTime.plusHours(hour);
return afterPlus.toDate();
}
public static Date parseY14S(String pattern){
SimpleDateFormat sdf = new SimpleDateFormat(STANDARD_TIME);
try {
return sdf.parse(pattern);
} catch (ParseException e) {
throw new RuntimeException(e.getMessage());
}
}
public static String formatY14S(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(STANDARD_TIME);
return sdf.format(date);
}
}