java 如何在JSR-352中正确地分配工作?

nom7f22z  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(126)

所以我使用Java Batch Processing已经有一段时间了。我的工作要么是从读取器到写入器的导入/导出工作,要么是编写Batchlets来进行一些更复杂的处理。由于我开始达到内存限制,我需要重新考虑架构。
所以我想更好地利用分块的Reader/Processor/Writer模式。显然我不确定如何在这三个项目上分配工作。在处理过程中,是否写入零个、一个或几个其他记录变得很清楚。
读者相当清楚:它从数据库中读取要处理的数据。但我不确定如何将记录写回数据库。我看到以下选项:

  • 现在让处理器在DB中存储可变数量的数据。
  • 使处理器向写入器发送可变数量的数据,然后写入器将执行写入操作。
  • 将整个逻辑放入编写器。

哪种方式最适合这种任务?

owfi6suc

owfi6suc1#

看看https://www.ibm.com/support/pages/system/files/inline-files/WP102706_WLB_JSR352.002.pdf,特别是章节 *Chunk/处理器 * 和 *Chunk/编写器 *,很明显这取决于我。
处理器可以返回一个对象,编写器必须理解并编写这个对象。因此,对于上面的情况,处理器在每个输入记录中有零个、一个或多个项目要写,它应该简单地返回一个列表。这个列表可以包含零个、一个或多个元素。编写器必须理解列表并将其元素写入数据库。
因为逻辑是这样划分的,所以代码仍然是可插入的,并且可以很容易地扩展或维护。
Addon:由于这次读取器和写入器都连接到同一个数据库,我发现在提交每个块时,读取器的连接也会失效。解决方案是为读取器使用非JTA数据源。

ws51t4hk

ws51t4hk2#

通常情况下,条目处理器处理从条目读取器传递过来的输入条目,处理结果可以为null或域对象,因此不适合您的情况,因为处理结果可能会拆分为多个对象,我假设即使在您的情况下,来自处理迭代的多个对象是不常见的。所以我建议只在必要的时候才使用list或任何集合类型作为处理对象的元素类型,在其他更常见的情况下,项目处理器仍然会返回null(跳过当前处理的项目)或一个域对象。
当项目编写器遍历累积的项目时,它可以检查它是否是一个集合,然后写出所有包含的元素。对于域对象类型,就像平常一样写它。
使用非jta数据源作为读取器是很好的。我想你会希望从头到尾保持读取器连接打开,以保持从结果集阅读。在项目编写器中,连接通常在写操作开始时获得,并在块事务提交或回滚结束时关闭。
一些可能有帮助的资源:
Jakarta Batch APIjberet-support JdbcItemReaderjberet-support JdbcItemWriter

相关问题