龙空技术网

Java实现定时任务需求的几种方式(含SpringTask方式)

大胡同学ii 338

前言:

而今大家对“java定时任务配置文件”可能比较关心,各位老铁们都想要剖析一些“java定时任务配置文件”的相关资讯。那么小编同时在网上汇集了一些关于“java定时任务配置文件””的相关内容,希望兄弟们能喜欢,我们一起来学习一下吧!

在做项目的时候时常会遇到一个需求要用到定时任务,所以简单整理了一下定时执行某个任务的几种方式:

使用java自带的Timer类和ScheduledExecutorService类。(使用得较少)使用SpringTask,Spring3.0之后自带的Task。用起来比较方便(笔者推荐使用)使用Quartz调度器,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。

简单举几个栗子吧…

Timer类实现的三种方式

 	/**     * 设定2000毫秒后执行     */    public static void timer01(){        Timer timer = new Timer();        timer.schedule(new TimerTask() {            @Override            public void run() {                System.err.println("------定时执行的任务------");            }        }, 2000);    }    /**     * 延时2秒后,隔5秒执行一次     */    public static void timer02(){        Timer timer = new Timer();        timer.scheduleAtFixedRate(new TimerTask() {            @Override            public void run() {                System.err.println("------定时执行的任务------");            }        }, 2000, 5000);    }    /**     * 指定时间执行。     */    public static void timer03(){        Calendar calendar = Calendar.getInstance();        calendar.set(Calendar.HOUR_OF_DAY, 17); // 17:56分执行        calendar.set(Calendar.MINUTE, 56);        calendar.set(Calendar.SECOND, 0);        Date date = calendar.getTime();        Timer timer = new Timer();        timer.scheduleAtFixedRate(new TimerTask() {            public void run() {                System.err.println("------定时执行的任务------");            }        }, date, 1000 * 60 * 60 * 24);    }
通过JDK自带的ScheduledExecutorService类实现定时任务
/** * @author Big.Hu */public class TaskTest {    public static void main(String[] args) {        ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();        /**         * 参数:任务体,第一次执行等待的时间,隔几秒执行,时间单位         */        scheduledExecutor.scheduleAtFixedRate(() -> task(), 2, 3, TimeUnit.SECONDS);    }    public static void task() {        String dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());        System.out.println("执行任务的时间:" + dateTime);    }}
使用SpringTask实现定时任务

配置线程池:如果只有一个定时任务则不用配置线程

/** * @author Big.Hu */@EnableAsync@EnableScheduling @SpringBootApplicationpublic class SpringTaskApplication {    public static void main(String[] args) {        SpringApplication.run(SpringTaskApplication.class, args);    }  @Bean  public ThreadPoolTaskScheduler taskScheduler() {         ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();         taskScheduler.setPoolSize(10);         taskScheduler.setThreadNamePrefix("zhiYouWo-task");         taskScheduler.initialize();         return taskScheduler;  }}

创建定时任务类

/** * @author Big.Hu */@Component@Async // 每个任务一个线程public class TaskTest {    /**     * cron表达式:2秒执行一次     */    @Scheduled(cron = "0/2 * * * * ?")    public void task01() {        String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());        System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);    }    /**     * 上一次任务执行完的时间点之后5秒再执行     */    @Scheduled(fixedDelay = 5000)    public void task02() {        String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());        System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);    }    /**     * 上一次任务开始时间点之后5秒再执行     */    @Scheduled(fixedRate = 5000)    public void task03() {        String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());        System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);    }    /**     * 第一次2秒后执行,后面每5秒执行一次     */    @Scheduled(initialDelay = 1000, fixedDelay = 5000)    public void task04() {        String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());        System.err.println("线程:" + Thread.currentThread().getName() + "正在执行,执行时间:" + date);    }}

任务执行中。控制台显示如下

控制台

使用Quartz调度器

Quartz配置类

/** * @author Big.Hu */@Configurationpublic class QuartzConfig {    @Bean    public JobDetail teatQuartzDetail() {        return JobBuilder.newJob(QuartzTest.class).withIdentity("quartzTest").storeDurably().build();    }    @Bean    public Trigger testQuartzTrigger() {        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()                .withIntervalInSeconds(2)  // 隔多久执行一次                .repeatForever();        SimpleTrigger quartzTest = TriggerBuilder.newTrigger().forJob(teatQuartzDetail())                .withIdentity("quartzTest")                .withSchedule(scheduleBuilder)                .build();        return quartzTest;    }}

定时任务类

/** * @author Big.Hu */public class QuartzTest extends QuartzJobBean {    /**     * 定时任务(业务逻辑)     */    @Override    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {        String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());        System.err.println(Thread.currentThread().getName() + ", 定时任务执行的时间:" + date);    }}

项目启动后会自动执行任务。控制台显示如下

控制台

标签: #java定时任务配置文件