java - 提交晚上执行的任务

标签 java spring spring-mvc scheduled-tasks quartz-scheduler

我们有一个 Web 应用程序(基于 Spring),用户可以在其中提交一些在单个后台线程中运行的任务。我们正在使用 TaskExecutor我们为此提交可运行对象,并在执行程序线程空闲时立即处理它们。

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

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

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

最佳答案

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

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

如果碰巧有很多任务,可以分批处理。

该工作的草图可以是:

@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 表达式.

关于java - 提交晚上执行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29895774/

相关文章:

java - 依赖 Spring 引导项目 application.properties 不注入(inject)默认值

java - Spring Restcontroller 不返回 xml

spring - 在spring mvc中将多个参数从 View 传递给 Controller

java - 如果按下键盘,JOptionPane 会中断扫描仪输入

java - 关闭嵌套流

Javascript_Java_Interaction 小程序 "Codebase"问题

java - 如何在 Spring boot 应用程序中配置 servlet init-param

javascript - 无法将js加载到html中

java - 升级到 Spring 3.2 后的 HttpMediaTypeNotAcceptableException

java - Java spring hibernate MVC 框架中jackson 库响应非常慢