例如我希望找到一种非绝对异步执行 @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:当然,我可以通过简单地在有限的时间内阻塞调用线程来实现这一点。但我希望在 spring 层中实现这一点
最佳答案
简而言之,不,没有办法配置 Spring 来执行此操作。
@Async
注释由 AsyncExecutionInterceptor
处理,它将工作委托(delegate)给 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
}
关于java spring 异步 future 及时阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15860197/