Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring@Scheduled fixedDelay未按预期工作_Spring_Scheduled Tasks - Fatal编程技术网

Spring@Scheduled fixedDelay未按预期工作

Spring@Scheduled fixedDelay未按预期工作,spring,scheduled-tasks,Spring,Scheduled Tasks,我想用以下方式安排我的工作: 1) 只有一个线程运行它。(连载) 2) 两次运行之间的固定间隔 我在方法上方使用@Scheduled(fixedDelay=10000),在applicationContext.xml中使用。但根据我打印的信息,两个作业之间的间隔不是我设置的10000毫秒。为什么呢 19:07-25 22:38:46.190 INFO schedule:33 [21-thread-1] - [job#1] is running. -----> 1469457526

我想用以下方式安排我的工作: 1) 只有一个线程运行它。(连载) 2) 两次运行之间的固定间隔

我在方法上方使用
@Scheduled(fixedDelay=10000)
,在applicationContext.xml中使用
。但根据我打印的信息,两个作业之间的间隔不是我设置的10000毫秒。为什么呢

19:07-25 22:38:46.190 INFO  schedule:33 [21-thread-1] - [job#1] is running.   ----->   1469457526190
20:07-25 22:38:48.191 INFO  schedule:45 [21-thread-1] - [job#1] use 2000ms
21:07-25 22:38:48.191 INFO  schedule:47 [21-thread-1] - [job#1] is finished.  ----->   1469457528191
25:07-25 22:39:03.198 INFO  schedule:33 [21-thread-1] - [job#1] is running.   ----->   1469457543198
26:07-25 22:39:05.201 INFO  schedule:45 [21-thread-1] - [job#1] use 2002ms
27:07-25 22:39:05.202 INFO  schedule:47 [21-thread-1] - [job#1] is finished.  ----->   1469457545202
31:07-25 22:39:20.205 INFO  schedule:33 [21-thread-1] - [job#1] is running.   ----->   1469457560205
32:07-25 22:39:22.209 INFO  schedule:45 [21-thread-1] - [job#1] use 2004ms
33:07-25 22:39:22.210 INFO  schedule:47 [21-thread-1] - [job#1] is finished.  ----->   1469457562210
37:07-25 22:39:37.213 INFO  schedule:33 [21-thread-1] - [job#1] is running.   ----->   1469457577213
38:07-25 22:39:39.215 INFO  schedule:45 [21-thread-1] - [job#1] use 2002ms
39:07-25 22:39:39.215 INFO  schedule:47 [21-thread-1] - [job#1] is finished.  ----->   1469457579215
43:07-25 22:39:54.221 INFO  schedule:33 [21-thread-1] - [job#1] is running.   ----->   1469457594221
44:07-25 22:39:56.225 INFO  schedule:45 [21-thread-1] - [job#1] use 2004ms
45:07-25 22:39:56.225 INFO  schedule:47 [21-thread-1] - [job#1] is finished.  ----->   1469457596225
49:07-25 22:40:11.525 INFO  schedule:33 [21-thread-1] - [job#1] is running.   ----->   1469457611525
50:07-25 22:40:13.528 INFO  schedule:45 [21-thread-1] - [job#1] use 2003ms
51:07-25 22:40:13.529 INFO  schedule:47 [21-thread-1] - [job#1] is finished.  ----->   1469457613529
55:07-25 22:40:28.237 INFO  schedule:33 [21-thread-1] - [job#1] is running.   ----->   1469457628237
您可以看到完成和运行之间的时间不是10000ms。(更像15000)

代码为(spring 4.2.1):


您可能在正在使用的线程池上存在争用。通过实现和连接ScheduledConfigure,创建自己的执行器来处理这些固定延迟任务


在configureTasks()的实现中,在方法参数ScheduledTaskRegistrar上将您自己的执行器设置为调度程序。

您可能会对正在使用的线程池产生争用。通过实现和连接ScheduledConfigure,创建自己的执行器来处理这些固定延迟任务

在configureTasks()的实现中,将您自己的执行器设置为方法参数ScheduledTaskRegistrar上的调度器

   @Scheduled(fixedDelay = 10000)
    public void timerJob1(){
        SCHEDULER.info("[job#1] is running.   ----->   {}", System.currentTimeMillis());
        Stopwatch stopwatch = Stopwatch.createStarted();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            long use = stopwatch.elapsed(TimeUnit.MILLISECONDS);
            SCHEDULER.info("[timeJob1] use {}ms", use);
        }

        long use = stopwatch.elapsed(TimeUnit.MILLISECONDS);
        SCHEDULER.info("[job#1] use {}ms", use);

        SCHEDULER.info("[job#1] is finished.  ----->   {}", System.currentTimeMillis());
    }