在我的应用程序中,我必须从主应用程序线程异步处理多个作业,并收集每个作业的结果。我有一个普通的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));
}
}
答案 0 :(得分:1)
您需要考虑什么是您的主要目标,因为您当前的代码将与其他Spring相关的类一起正常工作。 Spring提供对本机Java ExecutorService以及其他流行的第三方库(如Quartz
)的支持你可能会在弹簧容器上设置执行器服务(例如:在spring bean 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
类并注入对执行程序服务的引用
答案 1 :(得分:0)
我最终在Spring应用程序上下文中定义了bean,并将完成服务注入到MyService中。充当魅力。
<task:executor id="solverExecutorService" pool-size="5" queue-capacity="100" />
<spring:bean id="solverCompletionService" class="nl.marktmonitor.solver.service.SolverCompletionService" scope="singleton">
<constructor-arg name="executor" ref="solverExecutorService"/>
</spring:bean>