springboot定时任务与异步操作
相关注解
@EnableScheduling //开启定时任务(加在MainApplication类上)
@ComponentScan //将定时任务组件纳入容器中
@Scheduled(fixedRate=1000) //指定定时业务方法,同时指定执行时间间隔(加在任务方法上)
@Scheduled(cron = "10-20 * * * * ?") //指定特定的时间执行(例如:每一分钟的第10秒到第20秒执行,其他时刻不执行)
代码示例:
//@EnableScheduling //开启定时任务
public class MainApplication{}
//---------------------------------
/*定义每隔一秒钟执行任务*/
// @Scheduled(fixedRate = 1000) //指定间隔1秒执行一次
@Scheduled(cron = "10-20 * * * * ?") //每一分钟的第10秒到第20秒执行,其他时刻不执行
public void reportCurrentTime()
{
System.out.println("现在时间:" + DATA_FORMAT.format(new Date()));
}
SpringBoot异步操作
@EnableAsync //开启异步操作
@Async //指定方法异步执行
代码示例:
@EnableAsync //开启异步任务
public class MainApplication{}
//------------------------------
@Async //指定方法异步执行
public Future<Boolean> doTaskOne() throws InterruptedException
{
long start = System.currentTimeMillis();
Thread.sleep(1000);
long end = System.currentTimeMillis();
System.out.println("任务一耗时:" + (end - start) + "毫秒");
return new AsyncResult<Boolean>(true);
}
静态: 基于注解创建定时任务
@Slf4j
@Configuration
@EnableScheduling
public class ScheduleTaskOne {
@Autowired
private StuInfoDao stuInfoDao;
// @Scheduled(cron = "0/5 * * * * ?") //每隔 5 秒执行一次
@Scheduled(fixedRate = 5000) //每隔 5 秒执行一次
public void task() {
List<StuInfo> list = stuInfoDao.selectByExample(new StuInfoExample());
log.info("创建定时任务方式一 定时查询数据: " + JSONObject.toJSONString(list));
System.out.println("创建定时任务方式一 定时查询数据: " + JSONObject.toJSONString(list));
}
}
动态: 基于接口实现定时任务
@Slf4j
@Component
@EnableScheduling
public class ScheduleTaskTwo implements SchedulingConfigurer {
@Autowired
private TaskTimeConfigDao timeConfigDao;
@Autowired
private StuInfoDao stuInfoDao;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
List<StuInfo> list = stuInfoDao.selectByExample(new StuInfoExample());
log.info("方式二 定时查询数据: " + JSONObject.toJSONString(list));
System.out.println("方式二 定时查询数据: " + JSONObject.toJSONString(list));
}
}, triggerContext -> {
//查询 执行时间配置的 结果 并对结果集以id进行 降序 排序 然后 取第一个
String cron = timeConfigDao.selectAll().stream().sorted(new Comparator<TaskTimeConfig>() {
@Override
//设置比较条件 用来排序 结果>0 降序
public int compare(TaskTimeConfig o1, TaskTimeConfig o2) {
return o2.getId() - o1.getId();
}
}).collect(Collectors.toList()).get(0).getCron();
if (StringUtils.isEmpty(cron)) {
//如果查询为null 则默认设置为 每隔5 秒执行一次
cron = "0/5 * * * * ?";
}
//返回执行周期
return new CronTrigger(cron).nextExecutionTime(triggerContext);
});
}
}
基于多线程定时任务
@Slf4j
@Component
@EnableAsync //开启多线程
public class ScheduleTaskThree {
@Autowired
private StuInfoDao stuInfoDao;
@Scheduled(fixedRate = 3000)
@Async //声明方法为异步调用
public void task1() {
List<StuInfo> list = stuInfoDao.selectByExample(new StuInfoExample());
log.info("方式三, 第一个线程 : " + JSONObject.toJSONString(list));
System.out.println("方式三, 第一个线程: " + JSONObject.toJSONString(list));
}
@Async //声明方法为异步调用
@Scheduled(fixedRate = 1000)
public void task2() {
List<StuInfo> list = stuInfoDao.selectByExample(new StuInfoExample());
log.info("方式三, 第二个线程 : " + JSONObject.toJSONString(list));
System.out.println("方式三, 第二个线程: " + JSONObject.toJSONString(list));
}
}