Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/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
Java 提交要在夜间执行的任务_Java_Spring_Spring Mvc_Scheduled Tasks_Quartz Scheduler - Fatal编程技术网

Java 提交要在夜间执行的任务

Java 提交要在夜间执行的任务,java,spring,spring-mvc,scheduled-tasks,quartz-scheduler,Java,Spring,Spring Mvc,Scheduled Tasks,Quartz Scheduler,我们有一个web应用程序(基于Spring),用户可以提交一些在单个后台线程中运行的任务。我们正在使用一个提交可运行文件的方法,一旦执行器线程空闲,它们就会被处理 现在,我们希望不要立即运行这些作业,而是在晚上的某个小时开始按顺序处理它们。在那之前,他们都会排队等待。我们不知道一天会有多少工作,也不知道需要多少时间,所以我们不想把它们单独安排在固定的时间 我已经看过Spring的Quartz集成,但到目前为止还没有发现任何有用的东西。如果这些挂起的作业以某种方式被持久化,这样它们就能在重新启动后

我们有一个web应用程序(基于Spring),用户可以提交一些在单个后台线程中运行的任务。我们正在使用一个提交可运行文件的方法,一旦执行器线程空闲,它们就会被处理

现在,我们希望不要立即运行这些作业,而是在晚上的某个小时开始按顺序处理它们。在那之前,他们都会排队等待。我们不知道一天会有多少工作,也不知道需要多少时间,所以我们不想把它们单独安排在固定的时间

我已经看过Spring的Quartz集成,但到目前为止还没有发现任何有用的东西。如果这些挂起的作业以某种方式被持久化,这样它们就能在重新启动后生存下来,那就太好了


有什么想法吗?提前感谢。

您可以使用cron表达式:

@Scheduled(cron = "* 2 * * *")
public void doSomething() {
}
例如,这将在每天凌晨2点运行


该类也可能对您有用,在Spring官方文档中有一小段关于它的内容,您在问题中已经链接了该部分。

让这些任务在重新启动后幸存下来的唯一方法是将它们及其数据保存在某种DBs中


对于调度问题,我将在特定服务上使用@Scheduled注释,该注释将从DB或您的执行者队列调用任务,然后对其进行处理。

您可以采取的一种方法是在提交任务后立即将其存储在数据库中

然后,在晚上,您可以运行一个作业来查询数据库并按顺序处理返回的任务。当每个任务的处理完成后,您可以从数据库中删除该任务或将其标记为已处理

如果碰巧有许多任务,您可以成批处理它们

该工作的草图可以是:

@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
}
@Scheduled(cron=“晚上的某个时间”)
public void runJob(){
//从数据库中查询未处理的任务
List tasks=database.getNonProcessedTasks();
//迭代返回的任务
for(任务t:任务){
试一试{
//处理当前任务
这个过程(t);
//将当前任务标记为已在数据库中处理,或将其删除
数据库。updateTaskAsProcessed(t);
}捕获(例外情况除外){
//处理ex,将其记录或存储以供进一步参考
}
}
}
专用作废流程(任务t){
//在此执行处理
}

Spring通过使用支持cron表达式

您可以在方法上添加
@Scheduled
注释,该方法调用
任务执行器

示例:

@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秒调用一次,这意味着该时间段将从之前每次调用的完成时间开始计算

有关这方面的更多详细信息,请参见以下链接:-


  • 谢谢你的回答。我知道将任务序列化到磁盘/bd是唯一的选择,但我希望有一些方法可以自动完成,Quartz保留TaskExecutor接口。感谢您的帮助。我希望有一些更“自动化”的解决方案,对现有代码的更改最小,但我想我会尝试一下。