Spring scheduling task - run only once

后端 未结 5 1056
我寻月下人不归
我寻月下人不归 2020-11-29 04:42

Is it possible to schedule Spring service method only once at exactly specified time? For example, current time is 2pm but when I hit the action button I want that my servic

5条回答
  •  盖世英雄少女心
    2020-11-29 05:04

    You can use one of Spring's TaskScheduler's implementations. I provided an example below with one which does not require too much configuration (ConcurrentTaskScheduler that wraps a single-threaded scheduled executor).

    The simplest method is the one named schedule that takes a Runnable and Date only. That will cause the task to run once after the specified time. All of the other methods are capable of scheduling tasks to run repeatedly.

    Read more on task execution & scheduling

    Simple working example:

    private TaskScheduler scheduler;
    
    Runnable exampleRunnable = new Runnable(){
        @Override
        public void run() {
            System.out.println("Works");
        }
    };
    
    @Async
    public void executeTaskT() {
        ScheduledExecutorService localExecutor = Executors.newSingleThreadScheduledExecutor();
        scheduler = new ConcurrentTaskScheduler(localExecutor);
    
        scheduler.schedule(exampleRunnable,
                new Date(1432152000000L));//today at 8 pm UTC - replace it with any timestamp in miliseconds to text
    }
    
    ...
    
    executeTaskT() //call it somewhere after the spring application has been configured
    

    Note:

    To enable support for @Scheduled and @Async annotations add @EnableScheduling and @EnableAsync to one of your @Configuration classes


    Update - cancelling the scheduled task

    TaskScheduler's schedule method returns a ScheduledFuture which is a delayed result-bearing action that can be cancelled.

    So in order to cancel it, you need to keep a handle to the scheduled task (i.e. keep the ScheduledFuture return object).

    Changes to the code above for cancelling the task :

    1. Declare the ScheduledFuture outside your executeTaskT method.
        private ScheduledFuture scheduledFuture;
    
    1. Modify your call to schedule to keep the return object as such:
        scheduledFuture = scheduler.schedule(exampleRunnable,
                        new Date(1432152000000L));
    
    1. Call cancel on the scheduledFuture object somewhere in your code
        boolean mayInterruptIfRunning = true;
        scheduledFuture.cancel(mayInterruptIfRunning);
    

提交回复
热议问题