Batchlet是在JavaEE批处理中实现ETL步骤的正确方法吗?

Batchlet是在JavaEE批处理中实现ETL步骤的正确方法吗?,java,jakarta-ee,java-ee-7,java-batch,Java,Jakarta Ee,Java Ee 7,Java Batch,我正在研究Javaee批处理API(jsr-352),以便测试使用该技术为我们自己的解决方案更换当前ETL工具的可行性 我的目标是建立一份工作,我: 在步骤1中从数据源获取一些(虚拟)数据 步骤2中来自其他数据源的一些其他数据和 在步骤3中合并它们 我希望处理每个项目,而不是写入文件,而是将其发送到下一步。并存储信息以供进一步使用。我可以使用batchlets和jobContext.setTransientUserData()实现这一点 我认为我没有正确理解这些概念:据我所知,JSR-352

我正在研究Javaee批处理API(jsr-352),以便测试使用该技术为我们自己的解决方案更换当前ETL工具的可行性

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

  • 在步骤1中从数据源获取一些(虚拟)数据
  • 步骤2中来自其他数据源的一些其他数据和
  • 在步骤3中合并它们
我希望处理每个项目,而不是写入文件,而是将其发送到下一步。并存储信息以供进一步使用。我可以使用batchlets和
jobContext.setTransientUserData()
实现这一点

我认为我没有正确理解这些概念:据我所知,JSR-352适用于此类ETL任务,但它有两种类型的步骤:chunk和batchlet。块是“三阶段”的步骤,在其中读取、处理和写入数据。Batchlet是不在数据的每个项目上执行的任务,但只执行一次(如计算总数、发送电子邮件和其他)

我的问题是,如果我考虑小批的定义,我的解决方案是不正确的。< /P>
如何使用Javaee批处理API实现这个kinf od作业?

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

  • ItemReader#open()
    :打开光标(创建
    连接
    语句
    结果集
    ),并将其保存为
    ItemReader
    的实例变量
  • ItemReader#readItem()
    :使用
    ResultSet
  • ItemReader#close()
    :关闭JDBC资源
  • ItemProcessor#processItem()
    :进行计算,创建并返回一个包含结果的对象
  • ItemWriter#writeItems()
    :将计算数据保存到数据库。打开
    连接
    语句
    并调用
    执行更新()
    并关闭它们
至于您的情况,我认为您必须选择一个可以作为主要数据的数据,并在
ItemReader\open()
中为其打开一个光标。然后在
ItemProcessor#processItem()
中为每个项目获取另一个

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

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


谢谢你的回答,在你看来,我应该有一个一步的工作,在这个工作中我执行所有ETL逻辑?我理解,但是批处理API的想法不就是我可以用简单的步骤来打破流程吗?(这是一个诚实的问题,我觉得我对这个JSR缺乏一些基本的了解)如果您的整个数据小到足以加载到内存中,并且您对区块处理的优势没有兴趣,例如事务管理、跳过无效数据、重试、保存度量或从剩余数据重新启动,我认为您可以使用您提到的
getTransientData()
setTransientData()
实现包含3个简单(Batchlet)步骤的作业。我希望这能回答你的问题。