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

Spring启动ItemWriter的多线程

充昌勋
2023-03-14

我有一个Spring Boot Batch作业,有两个主要步骤,第一个从电子表格中读取一堆行。第二个写入数据库。现在,它被设置为串行写入数据库

public CompositeItemWriter<SoftLayerData> compositeSoftlayerDataWriter(
    JpaItemWriter<SoftLayerData> softlayerDataWriter) {
  CompositeItemWriter<SoftLayerData> compositeWriter = new CompositeItemWriter<>();
  compositeWriter.setDelegates(asList(softlayerDataWriter));
  return compositeWriter;
}

问题是体积太大。因为没有理由维持任何秩序,我希望有多个作家。我试过这个:

final int writerCount = 10;
List<ItemWriter<? super SoftLayerData>> writers = new ArrayList<>(writerCount);
for(int counter=0;counter<writerCount;counter++) {
  writers.add(new JpaItemWriter<SoftLayerData>());
}
CompositeItemWriter<SoftLayerData> result = new CompositeItemWriter<>();
result.setDelegates(writers);
return result;

但我得到了一个IllegalArgumentException:没有指定EntityManagerFactory

我喜欢这种方法,但我怀疑我必须遵循一些非常复杂的Spring Boot方法。做多个作家的最佳方法是什么?

谢谢,樵夫

共有1个答案

曾光远
2023-03-14

CompositeItemWriter调用委托编写器是顺序的,而不是并行的。因此,在复合编写器中创建10JpaItemWriters作为代理不会使您的步骤成为多线程的。

如果希望该步骤变为多线程,则需要向其添加一个TaskExecutor,例如:

@Bean
public TaskExecutor taskExecutor() {
    return new SimpleAsyncTaskExecutor("spring_batch");
}

@Bean
public Step sampleStep(TaskExecutor taskExecutor) {
    return this.stepBuilderFactory.get("sampleStep")
                .<String, String>chunk(10)
                .reader(itemReader())
                .writer(itemWriter())
                .taskExecutor(taskExecutor)
                .build();
}

请参阅多线程步骤。

现在的问题是,您正在使用new操作符创建JpaItemWriter,因此Spring不会调用afterPropertiesSet方法来检查强制属性。您需要在此编写器上设置一个EntityManagerFactory

 类似资料:
  • 我一直在尝试写一些java应用程序。这个应用程序想要运行的是处理一个文本文件。 但是,输入文本文件很大(超过200MB),我尝试将200MB拆分为四个拆分文件(每个50MB) 所以,每一个都只需要0.5秒,但是用这种线性运行,每一个也需要2秒。(worker1+0.5s,worker2+0.5s,worker3+0.5s,worker4)如果我可以同时运行4个线程,我预计这个应用程序只需要0.5秒

  • 我有下面的实现来使用Spring Boot应用程序使用来自Azure Service Bus的消息,但是我希望能够控制ServiceBusConsumer使用Spring Boot profile属性自动开始侦听主题 在应用程序中类似这样的内容。亚马尔 它应该禁止ServiceBusConsumer侦听主题,并且我应该能够使用RESTAPI启动ServiceBusConsumer-例如:/api/

  • 本文向大家介绍Python多线程编程(二):启动线程的两种方法,包括了Python多线程编程(二):启动线程的两种方法的使用技巧和注意事项,需要的朋友参考一下 在Python中我们主要是通过thread和threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用threading模块实现多线程编程。一般来说,使用

  • 我有以下课程: 应用和配置类 MyRestController类 我的实用类 当我启动应用程序并将其作为独立jar运行时,或者从IDE(Eclipse)运行时,没有任何问题,一切都按预期进行。 然而,我想写一个单元测试来测试我的MyRestController类。。。我得到了一个NPE,因为自动连接字段util为null(在MyRestController类中)。 这是我的测试课: 我肯定错过了一

  • 我的问题是关于测试多模块Spring Boot应用程序。 我有一个多模块spring boot REST应用程序。应用程序的结构如下: 以上就是我的应用程序的结构。 SpringBootMainApplication是主要项目。SpringbootModule是SpringBootMainApplication中的子项目。“SpringBootMainApplication.war”WAR将在WA

  • 问题内容: 我一直在研究Spring / Spring MVC应用程序,并且希望添加性能指标。我遇到过Spring Boot Actuator,它看起来是一个不错的解决方案。但是我的应用程序不是Spring Boot应用程序。我的应用程序在传统容器Tomcat 8中运行。 我添加了以下依赖 我创建了以下配置类。 我什至可以按照StackOverflow另一篇文章的建议在每个配置类上添加 问题答案: