Spring MVC @Async限制任务

时间:2014-01-08 16:12:49

标签: spring spring-mvc asynchronous

我正在尝试在Spring MVC应用程序中实现一项功能,该功能将启动一项长期运行的工作。该任务将由Spring Controller启动。由于可能需要很长时间才能完成(几分钟到一个多小时),@ Async似乎是我想要做的完美候选。

一个要求是,我想限制每个id的异步任务。解释问题陈述。让我们说我们需要为给定的学生ID建立学生报告。控制器将启动给定id的报告作业。在任何给定时间,只能为给定的学生ID运行一份报告。

如果有新请求进入,如果有针对该ID运行的报告,我们要取消该报告并开始新工作(假设新请求将提供最新信息,旧请求不再相关) 。报告任务可以针对不同的ID运行(例如,学生ID 100和200的作业可以运行,但每个id只能运行一个任务...即,id不应该有两个作业)。

以下是控制器的外观:

@RequestMapping("/report/{id}")
.. ...
Future<Void> reportFuture = reportService.generate(id)
.....

服务看起来类似于:

@Async
public Future<Void> generate(int id) {
 ... Do some Long Calculations generate a report
}

那么,我们如何跟踪异步任务,以便我们知道是否有针对给定id运行的作业,如果是,取消该作业?

1 个答案:

答案 0 :(得分:1)

我最终通过创建一个跟踪报告的单例范围组件来解决这个问题。在进行服务调用时,它将首先检查组件以查看给定id是否有Future。如果没有,它将在该组件中添加Future并启动该过程。如果组件返回Future,则会在Future上调用取消并开始新的服务调用。