问题标签 [spring-batch-tasklet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
51 浏览

spring - Spring Batch 在一个小任务中运行重复的步骤(不止一次)

假设我有以下流程,Start->Step1->Step2->Step3->Step2->End

我为每个步骤创建了 tasklet 并如上所述配置了一个 Job。当作业被触发时,执行到 Step3 之前都很好,它会无限循环。那么有没有办法在 JobFlow 中不止一次地执行一个步骤。

我正在使用 Spring Batch 4.2.1.RELEASE。

0 投票
1 回答
169 浏览

spring - Spring Batch - Chunk 模型的条件步骤流

我有两个步骤,如果第 1 步处理器在过滤后没有返回任何项目,则应该跳过第 2 步。我看到ItemListenerSupport可以扩展并且可以使用后处理。

我的处理是基于块的,我想在处理完所有块之后设置退出状态,如果有任何项目未过滤。我目前正在添加未过滤的项目ExecutionContext并在下一步中使用。

如果过滤掉所有块的所有项目,我将如何阻止下一步

0 投票
2 回答
89 浏览

sql - 春季批处理项目阅读器中的子查询

假设我有一个人表。一个人可以拥有一到三个产品,它看起来像这样。

我应该为每个人获取所有产品,然后对其进行处理(对价格进行映射,执行一些逻辑),然后将计算数据写入最终表,该表仅包含两个字段(person_id 和计算值,其中 person_id 是键)

在这种情况下实现项目阅读器的最佳方法是什么?(获取每个人的所有产品并进行处理) 是否可以在项目阅读器中的一个查询中完成,或者我应该在项目处理器中为每个人进行额外查询?

0 投票
1 回答
23 浏览

spring-boot - Springboot+作业框架

我的要求是每当我们从 UI/Postman 调用某些 RestAPI 时,它应该在后端触发执行多个操作/任务的 JOB。示例:假设调用了一些 POST Rest API - 它应该调用“Identify-JOB”(执行多个活动)- 基于特定条件,它应该调用 PLANA-JOB 或 PLANB-JOB 1> 假设调用 PLANA-JOB,在这个 JOB 成功后,它应该触发另一个名为“finish-JOB”的 JOB。在失败时,它不应该调用另一个 JOB “finish-JOB”

你能在这里帮忙吗?我该怎么做?

0 投票
0 回答
22 浏览

multithreading - spring batch 多线程阅读器处理器编写器

我有一个用例,我需要在多个线程中运行读写器处理器,主要是为了提高性能,并且工作一致。

convertandPushRecord() 步骤由“MultipleThreaded-*”线程执行,其中“fileInitializationStep()”或“fileMetadataValidationStep()”等步骤由主线程或 JobLauncher 线程执行,如果配置如下:

有时(例如 10 次中的 1 次)我遇到的问题是步骤未由“MultiThreaded-*”线程执行,而不是由 joblauncher 线程或主线程执行,它会导致下游整个工作流出错。

这是春季批次的问题还是我错过了一些构造?

0 投票
0 回答
131 浏览

spring-batch - 块级别的 Spring Batch 事务/连接和提交边界管理

由于与现有应用程序集成的限制,我们需要为每个块使用单独的数据库连接,并在块的末尾管理提交边界一次提交。我们设计为使用远程分区并在工作人员处处理多个分区。分区步骤预期按顺序执行块。

我们尝试了一种结合 Chink Listener 和处理器的方法,在 chunk listener 方法之前获得的连接作为实例变量并在处理时使用它,

但是这个连接在 beforeChunk 方法处理的第一个项目之后被替换。在这种情况下使用资源少事务管理器。无论如何,不​​建议将此事务管理器用于生产。我们希望并行处理块,而不是预期的。我们还观察到,当我们通过 beforeChunk 方法在 writer 处保持连接时,调用 write 方法时会关闭。

第二种方法是使用 DataSourceTransactionManager ,但不确定如何从块级别使用的事务中获取连接。

步骤配置如下:-

在调用 write 之前,连接由数据源关闭。调用层次结构的屏幕截图如下。 在此处输入图像描述

0 投票
1 回答
157 浏览

spring-batch - 事务边界中的Spring批处理整个作业

我有一个用例,我可以使用弹簧批处理作业,我可以通过以下方式设计。

1)第一种方式:

Step1(面向块的步骤):从文件中读取—> 过滤、验证并将读取的行转换为 DTO(数据传输对象),如果有任何错误,将错误存储在 DTO 本身中 —> 检查是否有任何 DTO 有错误,如果没有写入数据库。如果是,则写入错误文件。

但是,这种方式的问题是 - 我需要事务边界中的整个 JOB。因此,如果任何块中出现故障,那么我不想写入 DB 并且想要回滚所有成功的写入直到 DB 中的那个点。如果任何块出现故障,上述方式迫使我为所有成功的写入编写回滚逻辑。

2) 第二种方式

第 1 步(面向块的步骤):从文件中读取项目 —> 过滤、验证和转换 DTO(数据传输对象)中的读取行。这确实将错误存储在 DTO 对象本身中。

第 2 步(Tasklet):读取从第 1 步创建的 DTO 的整个列表(而不是块)—> 检查是否有任何 DTO 在其中填充了错误。如果是,则中止对 DB 的写入并使 JOB 失败。

第二种方式,我得到了块处理和缩放的所有好处。同时,我为整个工作创建了事务边界。

PS两种方式在他们的第一步都不会有任何步骤失败,如果有失败;错误存储在 DTO 对象本身中。因此,总是会创建 DTO 对象。

问题是- 由于我是 Spring 批次的新手,采用第二种方式是否是一个很好的模式。有没有一种方法可以在步骤之间共享数据,以便整个 DTO 列表可用于第二步(以上第二种方式)?

0 投票
0 回答
80 浏览

spring-batch - Spring Batch:如何在追加文件并且没有要写入的项目时写入文件头

我正在尝试将项目写入由“类型 ID”捆绑的文件。该文件将包含多个这样的项目包。共享相同类型 ID 的每个项目包都必须具有相应的页眉和页脚。

我将 Spring Batch 配置为有一个单独Step的按类型 ID 读取数据库记录(使用 a ,将类型 ID 作为方法参数传递给它)并使用andRepositoryItemReader将它们连同它们的页眉和页脚一起写入文件。FlatFileHeaderCallbackFlatFileFooterCallback

第一步的FlatFileItemWriter设置appendfalse,而后续步骤的编写者append设置为 ,true因此他们不会覆盖之前写入文件的内容。

我的文件应该是这样的:

问题 1:追加

但是,AbstractFileItemWriter.doOpen()不会调用我的FlatFileHeaderCallbackwhenappend为真,因此 Header 仅在文件的第 1 行写入第一步,并且文件缺少“中间”标题:

问题 1 的解决方案

为了解决这个问题,我放弃了FlatFileFooterCallback并编写了我自己FlatFileItemWriter的写标题,无论append但仅当写入的行数为零时。到目前为止,一切都很好。它以我需要的格式生成文件,以及“中间”标题。

问题 2:编写零项

进一步的要求是,即使数据库没有给定类型 ID 的项目,文件也必须具有对应于类型 ID 的页眉和页脚(并且两者之间没有项目行)。它应该如下所示:

但相反,只写入页脚。没有标题的迹象:

我追踪到它的工作方式SimpleChunkProcessor。如果它收到一个空的项目列表,它不会调用 to MyItemWriter.write(),所以当我有零个项目时,我的标题不可能被写出。

来自SimpleChunkProcessor

还有来自SimpleChunkProcessor

问题 2 的可能解决方案

但是,SimpleChunkProcessor.isComplete()是受保护的,所以我将其子类化,覆盖isComplete()为 return false

但是如何让我HeaderWritingChunkProcessor进入我的应用程序?在我的步骤配置中或其他地方设置它在哪里?

还是我错过了一个更简单的解决方案来实现我的两个核心要求?

  1. 即使在附加模式下也要写一个标题,而不仅仅是在文件的第 1 行。
  2. 即使有零个项目要写入,也要写一个标题。

我应该补充一点,页脚总是写在我需要它们的文件中,所以这些没有问题。

谢谢你。

0 投票
1 回答
38 浏览

java - 在等待下一步之前,我可以让 Spring 步骤在第一步中提交到 db 吗?

再会,

我有一个使用不同步骤的 Spring 批处理,作业如下所示:

在我的step1()中,它有自己的读取器、处理器和写入器,在这个写入器中,我将更新表 A。

然后在 my 中step2(),它也有自己的阅读器、处理器和编写器。而这个reader是从A表中读取的,从逻辑上讲,它需要依赖A表中的数据更新。

但是,当我运行这个批处理作业时,我发现我的step2()阅读器实际上选择了与 相同的数据step1(),无论如何我可以让step1()作者先提交,然后我的step2()阅读器读取更新的数据?

0 投票
0 回答
51 浏览

spring-batch - Spring Batch 使用 JDBCCursorItemReader:不提取指定块大小的所有记录

我有一种情况,我正在使用带有 JdbcCursorItemReader 方法的 Spring Batch 框架。

问题是我的查询需要更长的时间,接近 1.2 到 1.5 分钟来处理记录(正在进行优化)。

块大小设置为 60K。

在非生产环境中,任务成功处理了一天(<60K)要提取的记录并完成。

笔记:

  1. 非产品表中的总记录:~40-50K
  2. prod 表中的总记录:~100-150K

但似乎在产品中,任务不是从数据库中提取整组记录(SQL SERVER)

例如,数据库中一天的数据要提取的记录总数为 25148。但任务仅提取了 5148。

我无法在非产品中复制此问题。

任何建议都会有所帮助。