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

Spring Batch:如何使块处理成为多线程处理

公良光熙
2023-03-14
<!-- Reader bean for our simple Text file -->
<bean id="productReader" class="com.mycompany.batching.reader.productItemReader"
    scope="step">
    <property name="userId" value="#{jobParameters['userId']}" />
    <property name="dataId" value="#{jobParameters['dataId']}" />
</bean>


<!-- Processor for the data red from text file -->
<bean id="productProcessor" class="com.mycompany.batching.processor.productItemProcessor">
</bean>

<!-- Persisting data to database -->
<bean id="productWriter" class="com.mycompany.batching.writer.productItemWriter">
</bean>

<batch:job id="simpleProductImportJob" xmlns="http://www.springframework.org/schema/batch">
    <batch:step id="importFileStep">
        <batch:tasklet>
            <batch:chunk reader="productReader" processor="productProcessor"
                writer="productWriter" commit-interval="1" />
        </batch:tasklet>
    </batch:step>
</batch:job>

如何使这个多线程。?

共有1个答案

冀越
2023-03-14

实现这一目标的最佳方法是分步分区。假设您的源是一个文件,1。根据某些逻辑拆分文件2。分区器将挑选文件并将每个文件分配给从机。

batch-context.xml

<batch:step id="fileProcessMaster">
        <batch:partition partitioner="filePartioner" step="readAndInsertToDb">
            <batch:handler task-executor="taskExecutor" />
        </batch:partition>
    </batch:step>

filePartitioner.java

public class FilePartitioner implements Partitioner{

@Override
public Map<String, ExecutionContext> partition(int gridSize) {
     Map<String, ExecutionContext> map = new HashMap<String, ExecutionContext>();
        int i = 0;
        File[] files = new File(inboundDirectory).listFiles((FileFilter) new PrefixFileFilter(*);
        for (File file : files) {
            //Pick only those files which are splitted
            if (file.getName().contains("Split")) {
                ExecutionContext context = new ExecutionContext();
                context.putString("file", file.getAbsolutePath());
                map.put("slave" + i, context);
                i++;
            }
        }
        return map;
}
 类似资料:
  • 我想用3个步骤建立一个批次。我想配置这个步骤,就像如果有100条记录,当step1读取、处理和写入一个10块时,step02,然后step03开始和结束,然后再次返回step1,读取下一个块。这在Spring批量可能吗?

  • 问题内容: Java如何确定分配线程或进程的内核?有什么办法可以控制吗?防止两个大线程在同一内核上执行? 基本上,我要问的是有关Java中多线程如何工作或如何在Java中控制它的更多信息。 问题答案: 您不能为特定线程设置处理器关联。但是,如果将程序分为两个进程,则应该能够将这些进程分配给操作系统级别的特定处理器。 http://www.cyberciti.biz/tips/setting-pro

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 所以我正在编写代码,它将解析文件夹中的多个文本文件,收集它们的信息,并将这些信息保存在两个静态列表实例变量中。信息存放的顺序并不重要,因为我最终将对其进行排序。但由于某些原因,增加线程数不会影响速度。这是我的run方法和主方法中利用多线程的部分。 如果需要额外的信息,我基本上有一个静态实例变量作为我需要浏览的文件的数组,还有一个常量是线程数(为了测试目的手动更改)。如果我有4个线程和8个文件,每个

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 问题内容: 在效率和代码清晰性方面,决定使用线程或多处理时应遵循哪些良好准则? 问题答案: 线程和多处理之间的许多差异并不是真正针对Python的,某些差异特定于某个Python实现。 对于CPython,在以下情况下,我都将使用该模块: 由于性能原因,我需要同时使用多个内核。使用线程时,全局解释器锁(GIL)将阻止任何加速。(无论如何,有时在这种情况下您都可以避免使用线程,例如,当主要工作是在通