batchlets 是在 JavaEE Batch 中实现 ETL 步骤的正确方法吗?

Are batchlets the correct way of implementing ETL steps in JavaEE Batch?

我正在研究 Javaee Batch API (jsr-352) 以测试使用该技术将当前 ETL 工具更改为我们自己的解决方案的可行性。

我的目标是建立一份工作,我可以:

我想处理每个项目而不是写入文件,而是将其发送到下一步。并且还存储信息以供进一步使用。我可以使用 batchlet 和 jobContext.setTransientUserData().

来做到这一点

我想我没有理解正确的概念:据我了解,JSR-352 用于此类 ETL 任务,但它有两种类型的步骤:块和批处理。块是“三阶段步骤”,其中读取、处理和写入数据。 Batchlets 不是对数据的每个项目执行一次的任务,而是一次(如计算总数、发送电子邮件等)。

我的问题是,如果考虑batchlets的定义,我的解决方案是不正确的。

如何使用 Javaee Batch 实现这一 kinf od 作业 API?

我认为您最好使用块而不是批处理来实现 ETL。使用数据源的典型块处理如下所示:

  • ItemReader#open():打开游标(创建ConnectionStatementResultSet)并保存为ItemReader.[=47的实例变量=]
  • ItemReader#readItem():使用 ResultSet
  • 创建并 return 包含一行数据的对象
  • ItemReader#close(): 关闭 JDBC 资源
  • ItemProcessor#processItem():进行计算并创建 return 一个包含结果
  • 的对象
  • ItemWriter#writeItems():将计算的数据保存到数据库中。打开 ConnectionStatement 并调用 executeUpdate() 并关闭它们。

关于你的情况,我觉得你必须选择一个可以认为是主要的数据,并在ItemReader#open()中为它打开一个游标。然后在 ItemProcessor#processItem() 中为每个项目再买一个。

我还建议您阅读有用的块处理示例:

我关于 JBatch 和块处理的博客条目: