我正在尝试在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运行的作业,如果是,取消该作业?
答案 0 :(得分:1)
我最终通过创建一个跟踪报告的单例范围组件来解决这个问题。在进行服务调用时,它将首先检查组件以查看给定id是否有Future
。如果没有,它将在该组件中添加Future
并启动该过程。如果组件返回Future
,则会在Future
上调用取消并开始新的服务调用。