将Java'ExecutorService'与Spring'TaskExecutor混合使用`

将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(未来风险值:期货){ //重新显

我有一段Java代码,我以前在没有Spring的情况下使用过,如下所示:

/`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
    代码转换为使用
    Runnable
    s,同时仍然能够传播任务中的异常

我还考虑过将
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,现在一切正常。