繁体   English   中英

Spring Task Scheduler 连续任务

[英]Spring Task Scheduler consecutive tasks

我是使用 Spring Task Scheduler 执行任务的新手,所以这可能是一个基本问题。 我有一个要在实现Runnable的类中处理的项目列表。 这是我的任务类:

public class ProcessTask<T> implements Runnable {

private String item;

public ProcessTask(String item) {
    System.out.println("Starting process for " + item);
    this.item = item;
}

@Override
public void run() {
    System.out.println("Finishing task for " + item);
}

我想处理一个项目列表,每个项目在上一个任务开始后 10 秒开始。 我知道我可以将每个进程设置为在前一个进程计划后 10 秒运行,但是我不想依赖它,因为其他进程可能会导致任务在 10 秒过去之前运行。

所以在我的主要课程中,我有以下内容:

        Date end = new Date(cal.getTimeInMillis() + 10000); // this is the time that the task should be fired off, the first one being 10 seconds after the current time

    for(String item : items) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(end);
        System.out.println("Next task fires at " + cal.getTime());
        ProcessTask task = new ProcessTask(item);
        ScheduledFuture<?> future = taskScheduler.schedule(task, end);

        end = new Date(Calendar.getInstance().getTimeInMillis() + 10000);
    }

第一个任务在代码运行 10 秒后触发,这很好。 但是其余的项目会立即得到安排,而不是等待 10 秒。 我确实理解为什么会发生这种情况 - 因为taskScheduler.schedule是异步的,所以 for 循环只会继续,其余的项目会在 10 秒后被安排。

我尝试让主线程休眠一秒钟,并在调度下一个任务之前检查ScheduledFuture是否已完成,例如:

while(!future.isDone()) {
     Thread.sleep(1000);
     System.out.println("is future done: " + future.isDone());
}

如果我在ScheduledFuture<?> future = taskScheduler.schedule(task, end);之后立即添加这个块ScheduledFuture<?> future = taskScheduler.schedule(task, end); 在上面的块中, future.isDone()总是返回 false,并且ProcessTask run()方法永远不会被调用。

有没有什么办法可以使用ScheduledFuture来确定上一个任务是否已经结束,但如果还没有,继续等待? 有没有更好的方法来做到这一点? 提前致谢。

所以你不知道任务什么时候结束,但 10 秒后,你希望下一个任务运行。 因此,只有在完成该任务后才能进行规划。 所以,有一个基础抽象类,它做管道。

public abstract class ScheduleTaskAfterRun<T> implements Runnable {
    protected void executeContent();
    private Runnable nextTask;
    private taskScheduler; // init somehow, probably by constructor...

    public void setNextTask(Runnable r) {
        nextTask = r;
    }

    @Override
    public void run() {
        executeContent();
        scheduleNextTask();
    }

    private void scheduleNextTask() {
        if(nextTask == null) {
            System.out.println("No task to handle, finished!");
            return;
        }
        Date end = new Date(Calendar.getInstance().getTimeInMillis() + 10000);
        ScheduledFuture<?> future = taskScheduler.schedule(nextTask, end);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM