java spring 异步 future 及时阻止

标签 java spring asynchronous blocking

例如我希望找到一种非绝对异步执行 @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/

相关文章:

java - Hibernate JPA 模板合并更新引用的对象

python - 具有多个嵌套函数的 ndb.Tasklet 和 SyncTasklet

c++ - 如何安全地取消 Boost ASIO 异步接受操作?

java - Jenkins 中的 Maven 作业未在控制台输出中显示错误

java - 在 springboot aws lambda 中注入(inject)服务

JAVA:仅当在 JTextField 中进行更改时才启用 JButton

Spring <jee :remote-slsb> and JBoss AS7 - No EJB receiver available for handling

javascript - 函数在循环之前未完成

JavaFx 陷入 while 循环

java - 在 Docker 中使用 Spring Boot Actuator?