问题标签 [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.
spring - Spring Batch 在一个小任务中运行重复的步骤(不止一次)
假设我有以下流程,Start->Step1->Step2->Step3->Step2->End
我为每个步骤创建了 tasklet 并如上所述配置了一个 Job。当作业被触发时,执行到 Step3 之前都很好,它会无限循环。那么有没有办法在 JobFlow 中不止一次地执行一个步骤。
我正在使用 Spring Batch 4.2.1.RELEASE。
spring - Spring Batch - Chunk 模型的条件步骤流
我有两个步骤,如果第 1 步处理器在过滤后没有返回任何项目,则应该跳过第 2 步。我看到ItemListenerSupport
可以扩展并且可以使用后处理。
我的处理是基于块的,我想在处理完所有块之后设置退出状态,如果有任何项目未过滤。我目前正在添加未过滤的项目ExecutionContext
并在下一步中使用。
如果过滤掉所有块的所有项目,我将如何阻止下一步
sql - 春季批处理项目阅读器中的子查询
假设我有一个人表。一个人可以拥有一到三个产品,它看起来像这样。
我应该为每个人获取所有产品,然后对其进行处理(对价格进行映射,执行一些逻辑),然后将计算数据写入最终表,该表仅包含两个字段(person_id 和计算值,其中 person_id 是键)
在这种情况下实现项目阅读器的最佳方法是什么?(获取每个人的所有产品并进行处理) 是否可以在项目阅读器中的一个查询中完成,或者我应该在项目处理器中为每个人进行额外查询?
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”
你能在这里帮忙吗?我该怎么做?
multithreading - spring batch 多线程阅读器处理器编写器
我有一个用例,我需要在多个线程中运行读写器处理器,主要是为了提高性能,并且工作一致。
convertandPushRecord() 步骤由“MultipleThreaded-*”线程执行,其中“fileInitializationStep()”或“fileMetadataValidationStep()”等步骤由主线程或 JobLauncher 线程执行,如果配置如下:
有时(例如 10 次中的 1 次)我遇到的问题是步骤未由“MultiThreaded-*”线程执行,而不是由 joblauncher 线程或主线程执行,它会导致下游整个工作流出错。
这是春季批次的问题还是我错过了一些构造?
spring-batch - 块级别的 Spring Batch 事务/连接和提交边界管理
由于与现有应用程序集成的限制,我们需要为每个块使用单独的数据库连接,并在块的末尾管理提交边界一次提交。我们设计为使用远程分区并在工作人员处处理多个分区。分区步骤预期按顺序执行块。
我们尝试了一种结合 Chink Listener 和处理器的方法,在 chunk listener 方法之前获得的连接作为实例变量并在处理时使用它,
但是这个连接在 beforeChunk 方法处理的第一个项目之后被替换。在这种情况下使用资源少事务管理器。无论如何,不建议将此事务管理器用于生产。我们希望并行处理块,而不是预期的。我们还观察到,当我们通过 beforeChunk 方法在 writer 处保持连接时,调用 write 方法时会关闭。
第二种方法是使用 DataSourceTransactionManager ,但不确定如何从块级别使用的事务中获取连接。
步骤配置如下:-
在调用 write 之前,连接由数据源关闭。调用层次结构的屏幕截图如下。 在此处输入图像描述
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 列表可用于第二步(以上第二种方式)?
spring-batch - Spring Batch:如何在追加文件并且没有要写入的项目时写入文件头
我正在尝试将项目写入由“类型 ID”捆绑的文件。该文件将包含多个这样的项目包。共享相同类型 ID 的每个项目包都必须具有相应的页眉和页脚。
我将 Spring Batch 配置为有一个单独Step
的按类型 ID 读取数据库记录(使用 a ,将类型 ID 作为方法参数传递给它)并使用andRepositoryItemReader
将它们连同它们的页眉和页脚一起写入文件。FlatFileHeaderCallback
FlatFileFooterCallback
第一步的FlatFileItemWriter
设置append
为false
,而后续步骤的编写者append
设置为 ,true
因此他们不会覆盖之前写入文件的内容。
我的文件应该是这样的:
问题 1:追加
但是,AbstractFileItemWriter.doOpen()
不会调用我的FlatFileHeaderCallback
whenappend
为真,因此 Header 仅在文件的第 1 行写入第一步,并且文件缺少“中间”标题:
问题 1 的解决方案
为了解决这个问题,我放弃了FlatFileFooterCallback
并编写了我自己FlatFileItemWriter
的写标题,无论append
但仅当写入的行数为零时。到目前为止,一切都很好。它以我需要的格式生成文件,以及“中间”标题。
问题 2:编写零项
进一步的要求是,即使数据库没有给定类型 ID 的项目,文件也必须具有对应于类型 ID 的页眉和页脚(并且两者之间没有项目行)。它应该如下所示:
但相反,只写入页脚。没有标题的迹象:
我追踪到它的工作方式SimpleChunkProcessor
。如果它收到一个空的项目列表,它不会调用 to MyItemWriter.write()
,所以当我有零个项目时,我的标题不可能被写出。
来自SimpleChunkProcessor
:
还有来自SimpleChunkProcessor
:
问题 2 的可能解决方案
但是,SimpleChunkProcessor.isComplete()
是受保护的,所以我将其子类化,覆盖isComplete()
为 return false
:
但是如何让我HeaderWritingChunkProcessor
进入我的应用程序?在我的步骤配置中或其他地方设置它在哪里?
还是我错过了一个更简单的解决方案来实现我的两个核心要求?
- 即使在附加模式下也要写一个标题,而不仅仅是在文件的第 1 行。
- 即使有零个项目要写入,也要写一个标题。
我应该补充一点,页脚总是写在我需要它们的文件中,所以这些没有问题。
谢谢你。
java - 在等待下一步之前,我可以让 Spring 步骤在第一步中提交到 db 吗?
再会,
我有一个使用不同步骤的 Spring 批处理,作业如下所示:
在我的step1()
中,它有自己的读取器、处理器和写入器,在这个写入器中,我将更新表 A。
然后在 my 中step2()
,它也有自己的阅读器、处理器和编写器。而这个reader是从A表中读取的,从逻辑上讲,它需要依赖A表中的数据更新。
但是,当我运行这个批处理作业时,我发现我的step2()
阅读器实际上选择了与 相同的数据step1()
,无论如何我可以让step1()
作者先提交,然后我的step2()
阅读器读取更新的数据?
spring-batch - Spring Batch 使用 JDBCCursorItemReader:不提取指定块大小的所有记录
我有一种情况,我正在使用带有 JdbcCursorItemReader 方法的 Spring Batch 框架。
问题是我的查询需要更长的时间,接近 1.2 到 1.5 分钟来处理记录(正在进行优化)。
块大小设置为 60K。
在非生产环境中,任务成功处理了一天(<60K)要提取的记录并完成。
笔记:
- 非产品表中的总记录:~40-50K
- prod 表中的总记录:~100-150K
但似乎在产品中,任务不是从数据库中提取整组记录(SQL SERVER)
例如,数据库中一天的数据要提取的记录总数为 25148。但任务仅提取了 5148。
我无法在非产品中复制此问题。
任何建议都会有所帮助。