【发布时间】:2019-06-26 16:05:03
【问题描述】:
要求
我需要能够通过 POST 调用触发(长时间运行的)作业并立即返回。
一次只能运行一个线程。
这项工作是一项昂贵的工作,如果一项工作已经在进行中,我希望该工作的所有未来触发器都不做任何事情。
代码
@RestController
public class SomeTask {
private SomeService someService;
@Autowired
public SomeTask(SomeService someService) {
this.someService = someService;
}
@Async // requirement 1
@RequestMapping(method = RequestMethod.POST, path = "/triggerJob")
public void triggerJob() {
expensiveLongRunningJob();
}
/**
* Synchronized in order to restrict multiple invocations. // requirement 2
*
*/
private synchronized void expensiveLongRunningJob() {
someService.executedJob();
}
}
问题
上面的代码要求 1 和 2 都满足了。满足要求 3 的最佳方法是什么(让新线程作为 POST 调用的结果创建,跳过同步方法并在获取锁失败时立即返回)?
【问题讨论】:
-
我已经更新了问题部分。
-
如果一个工作开始并且已经完成,触发器应该做些什么吗?如果不是,则意味着该作业仅在一生中执行-您真的是这个意思吗?如果是,那肯定是糟糕的设计——一毫秒前不启动,现在启动——但实际上并没有发生根本性的变化。
-
@AlexeiKaigorodov 如果一项作业已启动并处理,则应忽略并发调用。一旦当前工作完成,就可以处理新的请求。简而言之,一次只运行一个作业 + 请求不会排队/阻塞。
标签: java spring multithreading