定时任务处理

This commit is contained in:
2024-12-30 15:32:56 +08:00
parent eca308e06f
commit 8ca14e05a1
21 changed files with 127 additions and 465 deletions

38
pom.xml
View File

@@ -137,11 +137,11 @@
<version>5.5.0</version> <version>5.5.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency> <!-- <dependency>-->
<groupId>com.alibaba</groupId> <!-- <groupId>com.alibaba</groupId>-->
<artifactId>druid</artifactId> <!-- <artifactId>druid</artifactId>-->
<version>1.1.10</version> <!-- <version>1.1.10</version>-->
</dependency> <!-- </dependency>-->
<!-- 苹果工具类 --> <!-- 苹果工具类 -->
<dependency> <dependency>
<groupId>com.auth0</groupId> <groupId>com.auth0</groupId>
@@ -262,11 +262,11 @@
</exclusions> </exclusions>
</dependency> </dependency>
<!--动态数据库切换--> <!--动态数据库切换-->
<dependency> <!-- <dependency>-->
<groupId>com.baomidou</groupId> <!-- <groupId>com.baomidou</groupId>-->
<artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- <artifactId>dynamic-datasource-spring-boot-starter</artifactId>-->
<version>4.1.3</version> <!-- <version>4.1.3</version>-->
</dependency> <!-- </dependency>-->
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
@@ -274,11 +274,11 @@
<version>${mysql.version}</version> <version>${mysql.version}</version>
</dependency> </dependency>
<!--oracle驱动--> <!--oracle驱动-->
<dependency> <!-- <dependency>-->
<groupId>com.oracle</groupId> <!-- <groupId>com.oracle</groupId>-->
<artifactId>ojdbc6</artifactId> <!-- <artifactId>ojdbc6</artifactId>-->
<version>${oracle.version}</version> <!-- <version>${oracle.version}</version>-->
</dependency> <!-- </dependency>-->
<!-- 用于定义sharding-jdbc 分片规则 --> <!-- 用于定义sharding-jdbc 分片规则 -->
<dependency> <dependency>
<groupId>org.apache.shardingsphere</groupId> <groupId>org.apache.shardingsphere</groupId>
@@ -303,10 +303,10 @@
<version>${mssql.version}</version> <version>${mssql.version}</version>
</dependency> </dependency>
<!--postgresql驱动--> <!--postgresql驱动-->
<dependency> <!-- <dependency>-->
<groupId>org.postgresql</groupId> <!-- <groupId>org.postgresql</groupId>-->
<artifactId>postgresql</artifactId> <!-- <artifactId>postgresql</artifactId>-->
</dependency> <!-- </dependency>-->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId> <artifactId>druid-spring-boot-starter</artifactId>

View File

@@ -1,6 +1,6 @@
package com.sqx.common.utils; package com.sqx.common.utils;
import com.alibaba.druid.util.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -81,13 +81,12 @@ public class ShardingConfig {
shardingRuleConfig.setTableRuleConfigs(addTableRuleConfigs()); shardingRuleConfig.setTableRuleConfigs(addTableRuleConfigs());
// 配置是否显示sql // 配置是否显示sql
// Properties props = new Properties(); Properties props = new Properties();
// props.put("sql.show", true); props.put("sql.show", showSql);
// 配置数据源 // 配置数据源
Map<String, DataSource> dataSourceMap = getShardingDataBase(); Map<String, DataSource> dataSourceMap = getShardingDataBase();
return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, null); return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
// return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
} }
/** /**
@@ -144,8 +143,6 @@ public class ShardingConfig {
masterSlaveRules.forEach((databaseName, masterSlaveRules) -> { masterSlaveRules.forEach((databaseName, masterSlaveRules) -> {
MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration(databaseName, MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration(databaseName,
masterSlaveRules.getMasterDataSourceName(), masterSlaveRules.getSlaveDataSourceNames()); masterSlaveRules.getMasterDataSourceName(), masterSlaveRules.getSlaveDataSourceNames());
System.out.println("写入"+masterSlaveRules.getMasterDataSourceName());
System.out.println("读出"+masterSlaveRules.getSlaveDataSourceNames());
sets.add(masterSlaveRuleConfig); sets.add(masterSlaveRuleConfig);
}); });
return sets; return sets;

View File

@@ -1,57 +0,0 @@
package com.sqx.modules.job.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.sql.DataSource;
import java.util.Properties;
/**
* 定时任务配置
*
*/
@Configuration
public class ScheduleConfig {
@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
//quartz参数
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "sqxScheduler");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
//线程池配置
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "20");
prop.put("org.quartz.threadPool.threadPriority", "5");
//JobStore配置
prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
//集群配置
prop.put("org.quartz.jobStore.isClustered", "true");
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
//PostgreSQL数据库需要打开此注释
//prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
factory.setQuartzProperties(prop);
factory.setSchedulerName("sqxScheduler");
//延时启动
factory.setStartupDelay(30);
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
//可选QuartzScheduler 启动时更新己存在的Job这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
factory.setOverwriteExistingJobs(true);
//设置自动启动默认为true
factory.setAutoStartup(true);
return factory;
}
}

View File

@@ -81,34 +81,34 @@ public class ScheduleJobController {
/** /**
* 立即执行任务 * 立即执行任务
*/ */
@SysLog("立即执行任务") // @SysLog("立即执行任务")
@RequestMapping("/run") // @RequestMapping("/run")
public Result run(@RequestBody Long[] jobIds){ // public Result run(@RequestBody Long[] jobIds){
scheduleJobService.run(jobIds); // scheduleJobService.run(jobIds);
//
return Result.success(); // return Result.success();
} // }
//
/** // /**
* 暂停定时任务 // * 暂停定时任务
*/ // */
@SysLog("暂停定时任务") // @SysLog("暂停定时任务")
@RequestMapping("/pause") // @RequestMapping("/pause")
public Result pause(@RequestBody Long[] jobIds){ // public Result pause(@RequestBody Long[] jobIds){
scheduleJobService.pause(jobIds); // scheduleJobService.pause(jobIds);
//
return Result.success(); // return Result.success();
} // }
//
/** // /**
* 恢复定时任务 // * 恢复定时任务
*/ // */
@SysLog("恢复定时任务") // @SysLog("恢复定时任务")
@RequestMapping("/resume") // @RequestMapping("/resume")
public Result resume(@RequestBody Long[] jobIds){ // public Result resume(@RequestBody Long[] jobIds){
scheduleJobService.resume(jobIds); // scheduleJobService.resume(jobIds);
//
return Result.success(); // return Result.success();
} // }
} }

View File

@@ -34,18 +34,18 @@ public interface ScheduleJobService extends IService<ScheduleJobEntity> {
*/ */
int updateBatch(Long[] jobIds, int status); int updateBatch(Long[] jobIds, int status);
/** // /**
* 立即执行 // * 立即执行
*/ // */
void run(Long[] jobIds); // void run(Long[] jobIds);
//
/** // /**
* 暂停运行 // * 暂停运行
*/ // */
void pause(Long[] jobIds); // void pause(Long[] jobIds);
//
/** // /**
* 恢复运行 // * 恢复运行
*/ // */
void resume(Long[] jobIds); // void resume(Long[] jobIds);
} }

View File

@@ -9,38 +9,22 @@ import com.sqx.common.utils.Query;
import com.sqx.modules.job.dao.ScheduleJobDao; import com.sqx.modules.job.dao.ScheduleJobDao;
import com.sqx.modules.job.entity.ScheduleJobEntity; import com.sqx.modules.job.entity.ScheduleJobEntity;
import com.sqx.modules.job.service.ScheduleJobService; import com.sqx.modules.job.service.ScheduleJobService;
import com.sqx.modules.job.utils.ScheduleUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct; import java.util.Arrays;
import java.util.*; import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service("scheduleJobService") @Service("scheduleJobService")
public class ScheduleJobServiceImpl extends ServiceImpl<ScheduleJobDao, ScheduleJobEntity> implements ScheduleJobService { public class ScheduleJobServiceImpl extends ServiceImpl<ScheduleJobDao, ScheduleJobEntity> implements ScheduleJobService {
@Autowired
private Scheduler scheduler;
/** /**
* 项目启动时,初始化定时器 * 项目启动时,初始化定时器
*/ */
@PostConstruct
public void init(){
List<ScheduleJobEntity> scheduleJobList = this.list();
for(ScheduleJobEntity scheduleJob : scheduleJobList){
CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
//如果不存在,则创建
if(cronTrigger == null) {
ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
}else {
ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
}
}
}
@Override @Override
public PageUtils queryPage(Map<String, Object> params) { public PageUtils queryPage(Map<String, Object> params) {
@@ -61,25 +45,18 @@ public class ScheduleJobServiceImpl extends ServiceImpl<ScheduleJobDao, Schedule
scheduleJob.setCreateTime(new Date()); scheduleJob.setCreateTime(new Date());
scheduleJob.setStatus(Constant.ScheduleStatus.NORMAL.getValue()); scheduleJob.setStatus(Constant.ScheduleStatus.NORMAL.getValue());
this.save(scheduleJob); this.save(scheduleJob);
ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void update(ScheduleJobEntity scheduleJob) { public void update(ScheduleJobEntity scheduleJob) {
ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
this.updateById(scheduleJob); this.updateById(scheduleJob);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteBatch(Long[] jobIds) { public void deleteBatch(Long[] jobIds) {
for(Long jobId : jobIds){
ScheduleUtils.deleteScheduleJob(scheduler, jobId);
}
//删除数据 //删除数据
this.removeByIds(Arrays.asList(jobIds)); this.removeByIds(Arrays.asList(jobIds));
} }
@@ -92,32 +69,32 @@ public class ScheduleJobServiceImpl extends ServiceImpl<ScheduleJobDao, Schedule
return baseMapper.updateBatch(map); return baseMapper.updateBatch(map);
} }
@Override // @Override
@Transactional(rollbackFor = Exception.class) // @Transactional(rollbackFor = Exception.class)
public void run(Long[] jobIds) { // public void run(Long[] jobIds) {
for(Long jobId : jobIds){ // for(Long jobId : jobIds){
ScheduleUtils.run(scheduler, this.getById(jobId)); // ScheduleUtils.run(scheduler, this.getById(jobId));
} // }
} // }
//
@Override // @Override
@Transactional(rollbackFor = Exception.class) // @Transactional(rollbackFor = Exception.class)
public void pause(Long[] jobIds) { // public void pause(Long[] jobIds) {
for(Long jobId : jobIds){ // for(Long jobId : jobIds){
ScheduleUtils.pauseJob(scheduler, jobId); // ScheduleUtils.pauseJob(scheduler, jobId);
} // }
//
updateBatch(jobIds, Constant.ScheduleStatus.PAUSE.getValue()); // updateBatch(jobIds, Constant.ScheduleStatus.PAUSE.getValue());
} // }
//
@Override // @Override
@Transactional(rollbackFor = Exception.class) // @Transactional(rollbackFor = Exception.class)
public void resume(Long[] jobIds) { // public void resume(Long[] jobIds) {
for(Long jobId : jobIds){ // for(Long jobId : jobIds){
ScheduleUtils.resumeJob(scheduler, jobId); // ScheduleUtils.resumeJob(scheduler, jobId);
} // }
//
updateBatch(jobIds, Constant.ScheduleStatus.NORMAL.getValue()); // updateBatch(jobIds, Constant.ScheduleStatus.NORMAL.getValue());
} // }
} }

View File

@@ -18,8 +18,8 @@ import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@Component("CashOutTask") @Component
public class CashOutTask implements ITask { public class CashOutTask{
@Resource @Resource
private CashOutDao cashOutDao; private CashOutDao cashOutDao;
@@ -30,7 +30,6 @@ public class CashOutTask implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void run(String params) { public void run(String params) {
logger.info("提现开始"); logger.info("提现开始");
List<CashOut> cashOuts = cashOutDao.selectYesterday(); List<CashOut> cashOuts = cashOutDao.selectYesterday();

View File

@@ -15,6 +15,7 @@ import com.sqx.modules.utils.AliPayOrderUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -23,8 +24,8 @@ import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@Component("CashOutTask2") @Component
public class CashOutTask2 implements ITask { public class CashOutTask2{
@Resource @Resource
private CashOutDao cashOutDao; private CashOutDao cashOutDao;
@@ -35,7 +36,6 @@ public class CashOutTask2 implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void run(String params) { public void run(String params) {
logger.info("提现开始"); logger.info("提现开始");
if (StringUtils.isBlank(params) || isValidDate(params)) { if (StringUtils.isBlank(params) || isValidDate(params)) {

View File

@@ -1,15 +0,0 @@
package com.sqx.modules.job.task;
/**
* 定时任务接口,所有定时任务都要实现该接口
*
*/
public interface ITask {
/**
* 执行定时任务接口
*
* @param params 参数多参数使用JSON数据
*/
void run(String params);
}

View File

@@ -9,14 +9,17 @@ import com.sqx.modules.discSpinning.service.DiscSpinningService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@Component("SpinningTask3") @Component
public class SpinningTask3 implements ITask { @EnableScheduling
public class SpinningTask3 {
@Resource @Resource
private DiscSpinningService spinningController; private DiscSpinningService spinningController;
@@ -25,8 +28,12 @@ public class SpinningTask3 implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Override @Scheduled(cron = "0 0/2 * * * ? ")
public void run(String params) { public void record() {
record("1");
}
public void record(String params) {
logger.info("大转盘到账补偿机制"); logger.info("大转盘到账补偿机制");
// 获取当前时间 // 获取当前时间
Date now = DateUtil.date(); Date now = DateUtil.date();
@@ -48,6 +55,7 @@ public class SpinningTask3 implements ITask {
recordQueryWrapper.lt("create_time", fiveMinutesAgoStr); recordQueryWrapper.lt("create_time", fiveMinutesAgoStr);
//小于 //小于
recordQueryWrapper.gt("create_time", tenMinutesAgoStr); recordQueryWrapper.gt("create_time", tenMinutesAgoStr);
logger.info("大转盘到账补偿时间范围{}-----{}", tenMinutesAgoStr, fiveMinutesAgoStr);
List<DiscSpinningRecord> list = recordService.list(recordQueryWrapper); List<DiscSpinningRecord> list = recordService.list(recordQueryWrapper);
ThreadUtil.execAsync(() -> { ThreadUtil.execAsync(() -> {
for (DiscSpinningRecord record : list) { for (DiscSpinningRecord record : list) {

View File

@@ -21,8 +21,8 @@ import java.util.List;
* @author GYJoker * @author GYJoker
*/ */
@Slf4j @Slf4j
@Component("SupplyAgainSignRewardTask") @Component
public class SupplyAgainSignRewardTask implements ITask { public class SupplyAgainSignRewardTask{
@Autowired @Autowired
private UserService userService; private UserService userService;
@@ -35,7 +35,6 @@ public class SupplyAgainSignRewardTask implements ITask {
@Autowired @Autowired
private UserMoneyService userMoneyService; private UserMoneyService userMoneyService;
@Override
public void run(String params) { public void run(String params) {
if (StringUtils.isBlank(params)) { if (StringUtils.isBlank(params)) {
log.error("参数为空"); log.error("参数为空");

View File

@@ -15,8 +15,8 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
@Component("TempCashOutTask") @Component
public class TempCashOutTask implements ITask { public class TempCashOutTask{
@Resource @Resource
private CashOutDao cashOutDao; private CashOutDao cashOutDao;
@@ -27,7 +27,6 @@ public class TempCashOutTask implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void run(String params) { public void run(String params) {
logger.info("提现开始"); logger.info("提现开始");
List<CashOut> cashOuts = cashOutDao.selectTemp(); List<CashOut> cashOuts = cashOutDao.selectTemp();

View File

@@ -40,8 +40,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@Component("TempOrdersTask") @Component
public class TempOrdersTask implements ITask { public class TempOrdersTask {
@Resource @Resource
private OrdersDao ordersDao; private OrdersDao ordersDao;
@@ -69,7 +69,6 @@ public class TempOrdersTask implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void run(String params) { public void run(String params) {
logger.info("订单表数据处理开始"); logger.info("订单表数据处理开始");
List<Orders> orders = ordersDao.selectList(Wrappers.<Orders>lambdaQuery() List<Orders> orders = ordersDao.selectList(Wrappers.<Orders>lambdaQuery()

View File

@@ -1,25 +0,0 @@
package com.sqx.modules.job.task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 测试定时任务(演示Demo可删除)
*
* testTask为spring bean的名称
*
*/
@Component("testTask")
public class TestTask implements ITask {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void run(String params){
logger.debug("TestTask定时任务正在执行参数为{}", params);
}
}

View File

@@ -1,72 +0,0 @@
package com.sqx.modules.job.utils;
import com.sqx.common.utils.SpringContextUtils;
import com.sqx.modules.job.entity.ScheduleJobEntity;
import com.sqx.modules.job.entity.ScheduleJobLogEntity;
import com.sqx.modules.job.service.ScheduleJobLogService;
import org.apache.commons.lang.StringUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.lang.reflect.Method;
import java.util.Date;
/**
* 定时任务
*
*/
public class ScheduleJob extends QuartzJobBean {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap()
.get(ScheduleJobEntity.JOB_PARAM_KEY);
//获取spring bean
ScheduleJobLogService scheduleJobLogService = (ScheduleJobLogService) SpringContextUtils.getBean("scheduleJobLogService");
//数据库保存执行记录
ScheduleJobLogEntity log = new ScheduleJobLogEntity();
log.setJobId(scheduleJob.getJobId());
log.setBeanName(scheduleJob.getBeanName());
log.setParams(scheduleJob.getParams());
log.setCreateTime(new Date());
//任务开始时间
long startTime = System.currentTimeMillis();
try {
//执行任务
logger.debug("任务准备执行任务ID" + scheduleJob.getJobId());
Object target = SpringContextUtils.getBean(scheduleJob.getBeanName());
Method method = target.getClass().getDeclaredMethod("run", String.class);
method.invoke(target, scheduleJob.getParams());
//任务执行总时长
long times = System.currentTimeMillis() - startTime;
log.setTimes((int)times);
//任务状态 0成功 1失败
log.setStatus(0);
logger.debug("任务执行完毕任务ID" + scheduleJob.getJobId() + " 总共耗时:" + times + "毫秒");
} catch (Exception e) {
logger.error("任务执行失败任务ID" + scheduleJob.getJobId(), e);
//任务执行总时长
long times = System.currentTimeMillis() - startTime;
log.setTimes((int)times);
//任务状态 0成功 1失败
log.setStatus(1);
log.setError(StringUtils.substring(e.toString(), 0, 2000));
}finally {
scheduleJobLogService.save(log);
}
}
}

View File

@@ -1,147 +0,0 @@
package com.sqx.modules.job.utils;
import com.sqx.common.exception.SqxException;
import com.sqx.common.utils.Constant;
import com.sqx.modules.job.entity.ScheduleJobEntity;
import org.quartz.*;
/**
* 定时任务工具类
*
*/
public class ScheduleUtils {
private final static String JOB_NAME = "TASK_";
/**
* 获取触发器key
*/
public static TriggerKey getTriggerKey(Long jobId) {
return TriggerKey.triggerKey(JOB_NAME + jobId);
}
/**
* 获取jobKey
*/
public static JobKey getJobKey(Long jobId) {
return JobKey.jobKey(JOB_NAME + jobId);
}
/**
* 获取表达式触发器
*/
public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
try {
return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
} catch (SchedulerException e) {
throw new SqxException("获取定时任务CronTrigger出现异常", e);
}
}
/**
* 创建定时任务
*/
public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
try {
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
//放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
scheduler.scheduleJob(jobDetail, trigger);
//暂停任务
if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
throw new SqxException("创建定时任务失败", e);
}
}
/**
* 更新定时任务
*/
public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
try {
TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
//按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
//参数
trigger.getJobDataMap().put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
scheduler.rescheduleJob(triggerKey, trigger);
//暂停任务
if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
throw new SqxException("更新定时任务失败", e);
}
}
/**
* 立即执行任务
*/
public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
try {
//参数
JobDataMap dataMap = new JobDataMap();
dataMap.put(ScheduleJobEntity.JOB_PARAM_KEY, scheduleJob);
scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
} catch (SchedulerException e) {
throw new SqxException("立即执行定时任务失败", e);
}
}
/**
* 暂停任务
*/
public static void pauseJob(Scheduler scheduler, Long jobId) {
try {
scheduler.pauseJob(getJobKey(jobId));
} catch (SchedulerException e) {
throw new SqxException("暂停定时任务失败", e);
}
}
/**
* 恢复任务
*/
public static void resumeJob(Scheduler scheduler, Long jobId) {
try {
scheduler.resumeJob(getJobKey(jobId));
} catch (SchedulerException e) {
throw new SqxException("暂停定时任务失败", e);
}
}
/**
* 删除定时任务
*/
public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
try {
scheduler.deleteJob(getJobKey(jobId));
} catch (SchedulerException e) {
throw new SqxException("删除定时任务失败", e);
}
}
}

View File

@@ -1,6 +1,6 @@
package com.sqx.modules.pay.wuyou; package com.sqx.modules.pay.wuyou;
import com.alibaba.druid.util.Utils; import com.sqx.modules.utils.MD5Util;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -23,7 +23,7 @@ public class Encrypt {
sb.append("key=").append(APP_SECRET); sb.append("key=").append(APP_SECRET);
String signStr = sb.toString(); String signStr = sb.toString();
System.out.println("signStr: " + signStr); System.out.println("signStr: " + signStr);
return Utils.md5(signStr).toUpperCase(); return MD5Util.encodeByMD5(signStr).toUpperCase();
} }
public static void main(String[] args) { public static void main(String[] args) {

View File

@@ -1,4 +1,4 @@
package com.sqx.config; package com.sqx.sharding;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory; import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory;

View File

@@ -16,7 +16,7 @@ spring:
shardingsphere: shardingsphere:
center-tables-data-node: duanju.%s center-tables-data-node: duanju.%s
# 显示sharding-jdbc改写的sql语句 # 显示sharding-jdbc改写的sql语句
show-sql: true show-sql: false
# 数据源名称 # 数据源名称
datasource: datasource:
# 数据源配置begin # 数据源配置begin

View File

@@ -1 +1 @@
center-tables=activity,app,banner,cash_out,comment_good,common_info,complet_award,coupon,coupon_user,course,course_classification,course_collect,course_comment,course_details,course_user,disc_spinning,disc_spinning_amount,disc_spinning_record,help_classify,help_word,invite,invite_award,invite_money,message_info,msg,orders,pay_classify,pay_details,qrtz_blob_triggers,qrtz_calendars,qrtz_cron_triggers,qrtz_fired_triggers,qrtz_job_details,qrtz_locks,qrtz_paused_trigger_grps,qrtz_scheduler_state,qrtz_simple_triggers,qrtz_simprop_triggers,qrtz_triggers,schedule_job,schedule_job_log,sdk_info,sdk_type,search,sys_captcha,sys_config,sys_dict,sys_log,sys_menu,sys_oss,sys_role,sys_role_menu,sys_user,sys_user_role,sys_user_token,task_center,task_center_record,task_center_reward,tb_user,uni_ad_callback_record,url_address,user_integral,user_integral_details,user_money,user_money_details,user_prize_exchange,user_sign_record,user_vip,vip_details center-tables=activity,app,banner,cash_out,comment_good,common_info,complet_award,coupon,coupon_user,course,course_classification,course_collect,course_comment,course_details,course_user,disc_spinning,disc_spinning_amount,disc_spinning_record,help_classify,help_word,invite,invite_award,invite_money,message_info,msg,orders,pay_classify,pay_details,qrtz_blob_triggers,qrtz_calendars,qrtz_cron_triggers,qrtz_fired_triggers,qrtz_job_details,qrtz_locks,qrtz_paused_trigger_grps,qrtz_scheduler_state,qrtz_simple_triggers,qrtz_simprop_triggers,qrtz_triggers,schedule_job,schedule_job_log,sdk_info,sdk_type,search,sys_captcha,sys_config,sys_dict,sys_log,sys_menu,sys_oss,sys_role,sys_role_menu,sys_user,sys_user_role,sys_user_token,task_center,task_center_record,task_center_reward,tb_user,uni_ad_callback_record,url_address,user_integral,user_integral_details,user_money,user_money_details,user_prize_exchange,user_sign_record,user_vip,vip_details,invite_achievement