e.g。我希望找到一种方法来执行@Async
方法,而不是绝对异步。
例如,我想调用@Async
任务,如果任务仍未完成,该任务将阻止我的进程达到最大定义时间。
@Async
public Future<ModelObject> doSomething() {
//here we will block for a max allowed time if task still haven't been completed
}
所以这样的代码将是半异步的,但阻塞时间可以由开发人员控制。
P.S:当然我可以通过在有限的时间内阻止调用线程来实现这一点。但我希望在春天层内实现这一目标答案 0 :(得分:0)
简而言之,不,没有办法配置Spring来执行此操作。
@Async
注释由AsyncExecutionInterceptor
处理,该工作将工作委托给AsyncTaskExecutor
。理论上,您可以编写自己的AsyncTaskExecutor
实现,但即便如此,也无法使用@Async
注释将所需的等待时间传递给执行程序。即使这样,我也不清楚调用者的界面会是什么样子,因为他们仍然会得到Future
个对象。您可能还需要继承Future
对象的子类。基本上,当你完成时,你将或多或少地从头开始编写整个功能。
您始终可以将返回的Future
对象包装在您自己的WaitingFuture
代理中,该代理提供备用的get实现,尽管那时您无法指定被调用方的等待值:< / p>
WaitingFuture<ModelObject> future = new WaitingFuture<ModelObject>(service.doSomething());
ModelObject result = future.get(3000); //Instead of throwing a timeout, this impl could just return null if 3 seconds pass with no answer
if(result == null) {
//Path A
} else {
//Path B
}
或者,如果您不想编写自己的课程,那么只需抓住TimeoutException
。
Future<ModelObject> future = doSomething();
try {
ModelObject result = future.get(3000,TimeUnit.MILLISECONDS);
//Path B
} catch (TimeoutException ex) {
//Path A
}
答案 1 :(得分:0)
您可以使用返回Future的@Async方法来执行此操作:
Array
(
[__ci_last_regenerate] => 1453313633
[email] => admin@admin.com
[is_logged_in] => 1
)