使用spring计划任务

时间:2016-05-01 04:54:14

标签: java spring-mvc taskscheduler

我正在为我的Web应用程序使用java Spring框架,我想安排一个任务在特定时间在服务器中运行。时间由应用程序的用户给出。

我调查了TaskScheduler,我找到了像

这样的例子
@Configuration
@EnableAsync
@EnableScheduling
public class MyComponent {

    @Async
    @Scheduled(fixedDelay=5000)
    public void doSomething() {
       System.out.println("Scheduled Task");
    }
}

同样的任务会定期发生一遍又一遍。它每隔5秒打印一次“预定任务”。但我只想打印一次(例如:上午11点35分)

任何人都可以帮助我。

2 个答案:

答案 0 :(得分:1)

如果您只想运行一次任务,那么您必须给出cron表达式,使其包含整个日期和时间(包括年份),以便它只匹配一次。

答案 1 :(得分:0)

最简单的修复,也许不是最佳的练习

简单的解决方法是在方法中添加if语句,并且仅在当前时间与您想要打印的时间匹配时才打印。

Java并不总是拥有最好的时间/日期实现,但是从Java 8开始,有一个名为LocalDateTime的新库,它运行良好。我认为使用它对于这个简单的解决方案来说是最好的选择。

以下是使用LocalDateTime获取当前小时,分钟和秒的示例。年,月,日等方法也有类似的方法。

LocalDateTime now = LocalDateTime.now();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();

我们可以将它与您当前的代码结合起来,只在您需要时执行print语句:

@Configuration
@EnableAsync
@EnableScheduling
public class MyComponent {

    @Async
    @Scheduled(fixedDelay=5000)
    public void doSomething() {

        LocalDateTime now = LocalDateTime.now();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();

        if(hour == 10 &&
           minute == 34 &&
           second < 6) {

            System.out.println("Scheduled Task");

        }

    }

}

您将小时与10和分钟比较为34,因为这些函数会返回0到n-1之间的数字,其中n是一小时内一天或几分钟的小时数。你将第二个与&lt; 6进行比较,这样无论何时开始这个工作(因为它每5秒执行一次),你每天至少在上午11:35打印一次。

我绝对不会建议这是最佳选项,但绝对是一种选择。每5秒创建一个新的LocalDateTime实例并不理想,但如果资源不是问题,那就没关系。

这不是最漂亮或最佳设计的解决方案,但它有效。如果您只是想要一个快速的解决方案并且您不关心完成此任务的正确“练习”,那么这是一个选项。