springboot 定时任务与异步操作

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));
    }

}

你可能感兴趣的:(实践是检验真理的唯一标准,spring,boot,java,spring)