将Java'ExecutorService'与Spring'TaskExecutor混合使用`
我有一段Java代码,我以前在没有Spring的情况下使用过,如下所示:将Java'ExecutorService'与Spring'TaskExecutor混合使用`,java,spring,spring-boot,Java,Spring,Spring Boot,我有一段Java代码,我以前在没有Spring的情况下使用过,如下所示: /`Callable`而不是`Runnable',因为我们需要抛出异常 公共MyTask扩展了可调用的{ @凌驾 public Void call()引发异常{…} } 公共类MyTasksRunner{ 私人最终执行服务; ... public void run()引发异常{ 列出任务=。。。; var futures=executorService.invokeAll(任务); for(未来风险值:期货){ //重新显
/`Callable`而不是`Runnable',因为我们需要抛出异常
公共MyTask扩展了可调用的{
@凌驾
public Void call()引发异常{…}
}
公共类MyTasksRunner{
私人最终执行服务;
...
public void run()引发异常{
列出任务=。。。;
var futures=executorService.invokeAll(任务);
for(未来风险值:期货){
//重新显示线程中发生的任何异常。
future.get();
}
}
}
现在,我将把这段代码合并到一个更大的启用了异步的Spring引导应用程序中。它配置了一个任务执行器
,它与执行器服务
没有相同的接口。TaskExecutor
只能运行Runnable
s,不能运行Callable
s
我可能有一个TaskExecutor
bean用于async-Spring,另一个ExecutorService
bean用于MyTasksRunner
代码。但我想知道如果我想合并这些,我有什么选择:
- 我可以告诉Spring使用
来实现它的异步功能吗ExecutorService
- 我是否可以将我的
代码转换为使用Callable
s,同时仍然能够传播任务中的异常Runnable
我还考虑过将
MyTask
制作成一个Spring组件,并用@Async
对其进行注释,但我并不喜欢这样做,因为它将MyTask*
代码绑定到Spring。是的,您可以将可调用的任务转换为可运行的
,因为我认为您不需要任何返回值。但有一个条件-您不能抛出选中的异常,但是您可以继续抛出运行时异常
同样,您可以如下定义Executor
bean来注入ExecutorService
@Bean
public Executor taskExecutor() {
ExecutorService executor = Executors.newFixedThreadPool(2);
return executor;
}
如果不定义Executor bean,Spring将创建并使用它。是的,您可以将可调用的任务转换为可运行的任务,因为我认为您不需要任何返回值。但有一个条件-您不能抛出选中的异常,但是您可以继续抛出运行时异常
同样,您可以如下定义Executor
bean来注入ExecutorService
@Bean
public Executor taskExecutor() {
ExecutorService executor = Executors.newFixedThreadPool(2);
return executor;
}
如果不定义执行器bean,Spring将创建并使用SimpleAsyncTaskExecutor
。您是否打算将executorService
字段替换为TaskExecutor
类型并注入该字段(或某种类型)?@Savior问题是TaskExecutor
不能与Callable
s一起工作。对,但如果是这样的话,那就是你所追求的解决方案了吗?@Savior是的,如果这允许异常传播。如果你通过ThreadPoolTaskExecutor
bean设置TaskExecutor
,你可以设置你的字段(和注入)属于该显式子类型。然后,您可以使用ThreadPoolTaskExecutor
的getThreadPoolExecutor
来获取底层ThreadPoolExecutor
,它是一个ExecutorService
。您是否打算将ExecutorService
字段替换为TaskExecutor
类型并注入该字段(或某种类型)?@Savior问题是TaskExecutor
不能与Callable
s一起工作。对,但如果是这样的话,那就是你所追求的解决方案了吗?@Savior是的,如果这允许异常传播。如果你通过ThreadPoolTaskExecutor
bean设置TaskExecutor
,你可以设置你的字段(和注入)属于该显式子类型。然后,您可以使用ThreadPoolTaskExecutor
的getThreadPoolExecutor
来获取底层ThreadPoolExecutor
,这是一个ExecutorService
。是的,我将选中的异常转换为RuntimeException
s,现在一切都正常了。是的,我将选中的异常转换为RuntimeException
s,现在一切正常。