我们有一个Web应用程序(基于Spring),用户可以在其中提交一些在单个后台线程中运行的任务。我们使用TaskExecutor为此我们提交runnables,并且只要执行程序线程空闲就会处理它们。
现在我们想立即不运行这些作业,但是在晚上的某个时刻按顺序开始处理它们。在那之前,他们都将排队等候。我们不知道一天会有多少工作,也不知道他们将花多少时间,因此我们不希望在固定时间单独安排工作。
我已经看过Spring的Quartz集成,但到目前为止我还没有找到任何有用的东西。如果这些待处理的工作以某种方式持续存在以便它们能够在重新启动后继续存在将会很好。
有什么想法吗?提前谢谢。
答案 0 :(得分:1)
让这些任务在重启过程中幸存下来的唯一方法就是将它们和数据保存在某种DB中。
对于日程安排问题,我会在特定服务上使用@Scheduled注释,该服务将从数据库或执行程序的队列中调用任务,然后处理它们。
答案 1 :(得分:1)
您可以采取的一种方法是在提交后立即将每个任务存储在数据库中。
然后,在晚上,您可以运行查询数据库并按顺序处理返回任务的作业。当每个任务的处理完成后,您可以从数据库中删除任务或将其标记为已处理。
如果碰巧有很多任务,你可以批量处理它们。
该工作的草图可能是:
@Scheduled(cron = "some_time_at_night")
public void runJob() {
// Query non processed tasks from the database
List<Task> tasks = database.getNonProcessedTasks();
// Iterated over returned tasks
for (Task t : tasks) {
try {
// Process current task
this.process(t);
// Mark current task as processed in database or delete it
database.updateTaskAsProcessed(t);
} catch (Exception ex) {
// Handle ex, either log it or store it for further reference
}
}
}
private void process(Task t) {
// Perform processing here
}
Spring通过@Scheduled
annotation支持cron表达式。
答案 2 :(得分:0)
您可以使用cron表达式:
@Scheduled(cron = "* 2 * * *")
public void doSomething() {
}
例如,这将在每天凌晨2点运行。
CronTrigger
课程也可能对您有用,在官方的Spring文档中有一个简短的部分,您已将其链接到该问题中。
答案 3 :(得分:0)
您可以在调用@Scheduled
TaskExecutor
注释
示例:
@Scheduled (cron="0 0 2 * * ? *", fixedDelay = 5000)
public void updateEmployeeInventory(){
System.out.println("Started fixed delay job");
/**
* add your scheduled job logic here
*/
}
fixedDelay:如果指定固定延迟为5秒,则注释方法将每隔5秒调用一次,具有固定延迟,这意味着将从完成时间开始测量周期每个前面的调用。
有关这方面的更多详情,请参阅以下链接: -