简而言之,不,没有办法配置 Spring 来做到这一点。
@Async
注释由将工作AsyncExecutionInterceptor
委托给AsyncTaskExecutor
. 理论上,您可以编写自己的实现,AsyncTaskExecutor
但即便如此,也无法使用@Async
注释将所需的等待时间传递给您的执行程序。即使那样,我也不清楚调用者的界面会是什么样子,因为他们仍然会Future
取回一个对象。您可能还需要对Future
对象进行子类化。基本上,当您完成时,您将或多或少地从头开始重新编写整个功能。
您始终可以将返回的对象包装Future
在您自己的WaitingFuture
代理中,该代理提供备用 get 实现,尽管即使那样您也无法在被调用方指定等待值:
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
}