java spring async future block及时

时间:2013-04-07 08:01:12

标签: java spring asynchronous blocking

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:当然我可以通过在有限的时间内阻止调用线程来实现这一点。但我希望在春天层内实现这一目标

2 个答案:

答案 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
)