Spring 批处理 - 创建一个文件,然后从同一个文件中读取

问题描述 投票:0回答:1

我应该从多个文件中读取,然后在应用一些处理和转换逻辑后写入单个文件。 为此,我创建了一个包含 3 个步骤的批处理作业,其中第 1 步和第 2 步负责读取数据并写入中间临时文件,最后在第 3 步或最后一步中,我尝试读取该临时文件并应用最终逻辑来创建最终文件。

我收到的错误是:

  • 步骤 1 和步骤 2 的最终结果总是成功创建中间临时文件,但步骤 3 无法创建最终文件。
  • 第 3 步能够找到并读取该文件,并且也成功准备了数据,但该文件从未被创建。
  • Spring Batch 抛出 MojoException,并且很难找到实际原因。
  • 为了测试,如果我保留预先创建的临时文件并直接运行最后一步,那么最终文件将成功创建。但是,当所有步骤都运行并且临时文件是动态创建的时,才会出现此错误。
  • 我尝试过使用
    start-next
    步骤以及
    flow
    ,即
    start
    -
    on(COMPLTED)
    -
    to
    -
    end
    方法,但每次都是相同的结果。
  • 最后,我在作家中将
    transactional
    制作为
    false
    forceSync
    制作为
    true
    ,但没有运气。

以下是作者和工作的片段:

new FlatFileOutputWriter(
    new FlatFileItemWriterBuilder<MyPOJO>()
        .name("lastFileWriter")
        .resource(new FileSystemResource("<THE PATH TO THE TEMPORARY FILE, THAT WAS CRATD IN THE PREVIOUS STEP>"))
        .shouldDeleteIfEmpty(true)
        .lineAggregator(
                (item) -> item.id() + fieldDelimeter + item.value())
        .append(false)
        .transactional(false)
        .forceSync(true)
        .build()
)

以下是工作片段:

return new JobBuilder("myJob", jobRepository)
    .listener(jobCompletionListener)
    .start(step1)
    .on("COMPLETD").to(step2)
    .on("COMPLETD").to(step3)
    .end()
    .build();

有人可以对此提供一些见解或建议吗?

spring-batch
1个回答
0
投票

我找到了一种替代方法来完成要求。这是我使用的逻辑-

  1. 第1步将读取文件并将处理后的数据保存在
    H2 DB
  2. 步骤 2 将使用不同的处理器执行与步骤 1 相同的操作
  3. 在最后一步中,将从
    H2 DB
    的表中读取数据并写入最终文件中
  4. 通过上述方法,只需使用
    next()
    来应用顺序流,而不是
    from()
    to()
    on()
  5. 的条件流

所以,片段应该看起来像这样 -

.start(step1, that will read the file and store in DB)
.next(step2, that will read another file and store in DB)
.next(step3, that will fetch the data from the DB and write in the file)

注: 如果数据从

DB
获取后直接写入文件,没有任何处理,那么不要使用任何处理器,即
step
(最后一个)将只有一个
reader
(从
DB
获取)和
writer
(写入文件)。

© www.soinside.com 2019 - 2024. All rights reserved.