定时任务的类型有许多种!总有一种是你中意的!
ThreadPoolTaskScheduler
在本文中,我们将使用ThreadPoolTaskScheduler来创建定时任务使用场景,它是SpringTaskScheduler接口的实现,可以用来做定时任务使用。它支持根据cron表达式创建周期性任务,可以非常方便地对重复执行的任务进行调度管理。
创建步骤:
1、将ThreadPoolTaskScheduler注册成bean对象
设置ThreadPoolTaskScheduler参数,并注册:
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(30);
threadPoolTaskScheduler.setThreadNamePrefix("DynamicTaskExecutor-");// 线程名称
threadPoolTaskScheduler.setAwaitTerminationSeconds(30); // 等待时长
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
return threadPoolTaskScheduler;
}
2、注入ThreadPoolTaskScheduler对象
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
3、实例化定时任务
expression为cron表达式,如:
每分钟执行一次:0 0/1 * * * ?
@PostConstruct
public void init() {
logger.info("定时任务设定时间为:{}",expression);
try {
future = threadPoolTaskScheduler.schedule(new FailReTryRunnable(),new Trigger(){
@Override
public Date nextExecutionTime(TriggerContext triggerContext){
return new CronTrigger(expression).nextExecutionTime(triggerContext);
}
});
}catch (Exception e){
throw new EInvoiceException("定时任务异常!"+e);
}
}
4、执行定时任务
根据设定的表达式,执行业务代码
class FailReTryRunnable implements Runnable {
@Override
public void run() {
String uuid = UUID.randomUUID().toString();
logger.info("定时执行调度开始{},任务编号:{}" , new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),uuid);
}
}
5、完整的代码如下
package ll.gg.hh.core.schedule;
import ll.gg.hh.commons.exception.EInvoiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.*;
import java.util.concurrent.*;
@Component
public class DynamicTask {
private Logger logger = LoggerFactory.getLogger(DynamicTask.class);
//执行定时任务表达式
@Value("${com.bs.coChainFail.expression}")
private String expression;
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(30);
threadPoolTaskScheduler.setThreadNamePrefix("DynamicTaskExecutor-");// 线程名称
threadPoolTaskScheduler.setAwaitTerminationSeconds(30); // 等待时长
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
return threadPoolTaskScheduler;
}
/**
* 初始化spring定时任务
*/
@PostConstruct
public void init() {
logger.info("定时任务设定时间为:{}",expression);
try {
future = threadPoolTaskScheduler.schedule(new FailReTryRunnable(),new Trigger(){
@Override
public Date nextExecutionTime(TriggerContext triggerContext){
return new CronTrigger(expression).nextExecutionTime(triggerContext);
}
});
}catch (Exception e){
throw new EInvoiceException("定时任务异常!"+e);
}
}
class FailReTryRunnable implements Runnable {
@Override
public void run() {
String uuid = UUID.randomUUID().toString();
logger.info("定时执行调度开始{},任务编号:{}" , new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),uuid);
/**
执行业务代码
*/
}
}
}