gpt4 book ai didi

multithreading - Spring相当于CompletionService?

转载 作者:行者123 更新时间:2023-12-04 08:26:30 26 4
gpt4 key购买 nike

在我的应用程序中,我必须从主应用程序线程异步处理多个作业并收集每个作业的结果。我有一个简单的 Java 解决方案,它使用 ExecutorService 和 ExecutorCompletionService 来收集作业结果。

现在我想将我的代码转换为 Spring 解决方案。 docs向我展示如何使用 ExecutorService 和 @Async 注释,但我不确定如何以及是否可以收集多个作业的结果。

换句话说:我正在寻找与 CompletionService 等效的 Spring。有这样的事吗?

我当前的代码:

class MyService {

private static ExecutorService executorService;
private static CompletionService<String> taskCompletionService;

// static init block
static {
executorService = Executors.newFixedThreadPool(4);
taskCompletionService = new ExecutorCompletionService<String>(executorService);

// Create thread that keeps looking for results
new Thread(new Runnable() {

@Override
public void run() {
while (true) {
try {
Future<String> future = taskCompletionService.take();
String s = future.get();
LOG.debug(s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

}).start();
}

// This method can and will be called multiple times,
// so multiple jobs are submitted to the completion service
public void solve(List<Long> ids) throws IOException, SolverException {
String data = createSolverData(ids);
taskCompletionService.submit(new SolverRunner(data, properties));
}
}

最佳答案

您需要考虑您的主要目标是什么,因为您当前的代码可以与其他与 Spring 相关的类一起正常工作。 Spring 提供对原生 Java ExecutorService 以及其他流行的 3rd 方库(如 Quartz)的支持

可能您所追求的是在spring容器上设置执行程序服务(例如:在您的spring beans xml上使用以下配置)

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="25" />
</bean>

并装饰您的 MyService @Service 的类(class)注释并注入(inject)对执行器服务的引用

关于multithreading - Spring相当于CompletionService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17285893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com