spring取消@异步任务

我希望能够在@Async将来取消带有注释的方法。

我有一个标有@Async注释的Spring方法。此方法进行一些计算,并最终返回结果。我见过的所有示例都建议使用AsyncResult该类返回此Future。

@Async

public Future<String> run() {

// ... Computation. Minutes pass ...

return new AsyncResult<String>("Result");

}

我以下列方式从另一个组件调用以下方法。出于示例目的,我希望立即取消该线程:

Future<String> future = component.run();

future.cancel(true);

在这种情况下,线程将永远不会被取消。这是因为,在AsyncResult这里查看Spring实现:[https](https://github.com/spring-

projects/spring-framework/blob/master/spring-

context/src/main/java/org/springframework/scheduling/annotation/AsyncResult.java#L71)

//github.com/spring-projects/spring-framework/blob/master/spring-

context/src/main/java/org/springframework/scheduling/annotation/

AsyncResult.java#L71,此方法实际上没有做任何事情。它只是返回false,表示无法取消线程。这是我的问题。如何取消该@Async方法创建的线程?我无权访问Spring创建的内部线程-

因此我无法取消该线程,对吗?

回答:

实际上,Spring

@Async使用自己的后台线程池。只要涉及到Future的cancel()方法或执行程序服务的shutdownNow(),调用executor.shutdownNow()

or

future.cancel(true)就不会立即停止正在进行的线程。这些方法所做的只是.interrupt()在相应线程上调用。而且interrupts

生效。它发出一个标志,因此无论何时处于睡眠或等待状态,线程都将停止。

需要注意的是,如果您的任务忽略中断,executor.shutdownNow() and

future.cancel(true)则其行为与完全相同executor.shutdown() and future.cancel(false)

如果需要停止慢速或阻塞操作的方法。如果您有一个长/无尽循环,则可以添加条件Thread.currentThread().isInterrupted(),如果为true,则不继续(结束操作)。

以上是 spring取消@异步任务 的全部内容, 来源链接: utcz.com/qa/425010.html

回到顶部