当前位置: 首页 > 知识库问答 >
问题:

Spring相当于CompletionService?

阚夕
2023-03-14

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

现在我想把我的代码转换成Spring解决方案。这些文档向我展示了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));
}
}

共有2个答案

子车雅珺
2023-03-14

最后,我在Spring应用程序上下文中定义了我的bean,并将completionservice注入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>
艾骏喆
2023-03-14

您需要考虑您的主要目标是什么,因为您当前的代码与其他与Spring相关的类一起可以很好地工作。Spring提供对本机Java ExecutorService以及其他流行的第三方库(如Quartz)的支持

可能您所追求的是在Spring容器上设置执行器服务(例如:在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>

并用@Service注释装饰您的MyService类,并将引用注入executor服务

 类似资料:
  • 问题内容: 是否有与 @Primary 等效的XML ,可以提升多个合格Bean之一 示例场景: 我有一个启用了自动配置功能的spring-boot应用程序。我已经定义了多个数据源,但是spring无法选择其中一个数据源作为其默认值。 datasources.xml 问题答案: 属性具有属性: 并记住: 如果通过XML声明了-annotated类,则注释元数据将被忽略,而是被尊重。

  • JSP规范允许我使用

  • 问题内容: 我有这个装饰器: 该代码仅能在linux上执行任何操作,就像在Windows上一样。在Windows中也可以使用此代码的最简单方法是什么? 问题答案: 它不是很漂亮,但是我不得不以跨平台的方式做类似的事情,于是我想到了使用单独的线程。基于信号的系统无法在所有平台上可靠地工作。 此类的使用可以包装在装饰器中,也可以制成上下文处理程序。 YMMV。

  • 问题内容: 我们曾经声明要在类之间传递数据,如下所示: 现在没有类,如何在类之间传递数据? 问题答案: Swift不区分属性和实例变量(即属性的基础存储)。要定义属性,只需在类的上下文中声明一个变量。 swift类只是ClassName.swift文件。 您将一个类和属性声明为 您可以通过点表示法访问属性值。作为Xcode6测试4的,也有访问修饰符(,并在SWIFT)。默认情况下,每个属性都是。有

  • 问题内容: 我正在将一些旧的PHP代码从mysql移植到MySQLi,但遇到了一个小问题。 有没有等效的旧功能? 当您处理多于1行时,我知道它比其他函数要慢,但是很多时候我只有1个结果和1个字段。使用它,我可以将4行压缩为1行。 旧代码: 所需代码: 但是没有这样的事情。:( 有什么我想念的吗?还是我必须吸收它并制作所有东西: 问题答案: PHP 5.4现在支持函数数组解引用,这意味着您可以执行以

  • 我们在Spring Boot的基础上开发了一个内部公司框架,我们希望通过Spring Cloud Stream支持Kafka Streams。我们需要自动向所有出站消息注入一些头。我们通过标准的Spring Cloud Stream Kafka Binder注册了一个定制的,实现了这一点,但这不适用于Kafka Streams,因为它们似乎遵循不同的路径。 对于Spring Cloud Strea