【问题标题】:Spring Batch: How exactly does executing a job all come together?Spring Batch:执行作业到底是如何结合在一起的?
【发布时间】:2015-08-16 04:18:54
【问题描述】:

正如标题所说,整个批处理作业究竟如何使用 Spring Batch?我了解(当然,如果我错了,请纠正我)有一个存储作业的存储库,然后每个作业都有步骤,每个步骤要么是一个 tasklet,要么是 ItemReaders 和 ItemProcessors 的组合,然后是 ItemWriter一大块已经被填满。

我不明白这一切在实际代码中的样子;我一直在阅读文档并查看示例,但我迷路了。我什至如何确切地告诉作业在我想要的时间/地点运行?大约有一百万个以“作业”开头的类,我如何将它们中的最少量一起使用来存储我定义的作业,然后在何时/何地运行它们?此外,我看到的所有示例要么完全/大部分基于 XML,但我想尽可能少地使用 XML。

另一个令我困惑的大问题是,ItemReader/Processor/Writers 究竟是如何知道他们正在使用的项目/项目块的?想象我自己实现了一个 ItemProcessor 并不太牵强,为此,我显然需要访问它正在处理的项目来处理它,或者对于一个 ItemWriter,我想访问该块它想写的项目。

【问题讨论】:

  • 何时执行 不是 Spring Batch 的一部分,例如使用计时器或石英库。我还想知道您是否真的查看了 ItemReaderItemWriterItemProcessor 的 javadoc,它们向您展示了 API 并回答了您的问题。
  • 是的,我从实际答案中知道,这些课程的文档回答了我的部分问题。文档似乎仍然没有向我说明如何使用 tasklet 作为步骤传递和访问具有作业的对象。

标签: java spring spring-batch


【解决方案1】:

Mkyong.com 有一些不错的弹簧batch tutorials,它给出了一些相当清楚的例子来说明工作配置的实际情况。请参阅here 的基本示例。不幸的是,这些示例大多是在 XML 中。这是一个blog post 使用 java config 的示例。

就项目读取器/处理器/写入器类型的步骤而言。您通常会有一个阅读器和至少一个处理器/写入器组合。两者都不是必需的。

在理解每一个方面,请查看界面 - 它们可能会帮助您理清思路。例如,这里是 ItemWriter 的接口:

void write(java.util.List<? extends T> items)

http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/ItemWriter.html

请注意,需要编写一批项目。处理器通常逐项工作。阅读器可以被分页(例如通过实现 AbstractPagingItemReader),并在实际执行提取之前收集迭代中的项目(例如,对数据库的分页查询)。

【讨论】:

  • 好的,那么现在如果我在我的步骤中使用 tasklet,那么 tasklet 如何访问作业要处理的项目?
【解决方案2】:

回答你的基本问题:-

1) 每个作业都有一个 id,您将使用该 id 确定要执行的作业。
2)作业一般由多个步骤组成,每个步骤都有一个名为next的属性。在下一个属性中,您将定义下一步要执行的步骤的 ID。
3) 每个步骤都有一个读取器、处理器和写入器,如果您的步骤执行的不是这些,您可以在 tasklet 中定义它。
4) 在定义 Reader 和 Writer 时,您必须定义它将获取或写入的数据类型。例如,在 BatchItemReader 中,您定义了一个 RowMapper。
5)您可以在加载作业定义后使用 JobExecutionDecider 来决定需要执行哪个步骤。对于剩余的步骤,它可以只使用下一个属性。

就像在 spring 中一样,您的应用程序上下文只需要知道您的作业定义,因为它需要知道要加载的 bean 定义。

Which job to execute:使用作业定义的ID。
Which step to execute in Job:对于第一步,可以使用JobExecutionDecider,否则使用next属性和要执行的下一步的ID。
@ 987654323@: reader 读取数据,处理器对获取的数据进行处理,最后 writer 写入数据。如果 step 做其他事情,在 tasklet 中定义它。

【讨论】:

  • 那么一个tasklet如何跟踪它正在做什么呢?假设我想为作业提供多个对象的输入,(通过列表)我什至如何首先传递对象,然后我实现的 tasklet 将如何访问它们以便我可以对它们进行处理?
  • 您可以将列表或任何其他对象存储在作业执行上下文中,并将您的 tasklet 的范围定义为 step,此存储的数据可以在任何其他 tasklet 中检索。有关如何在 tasklet 之间传递参数的问题,请参阅我的回答。
  • 如果在我调用作业运行之前作业执行不存在,我如何在作业运行之前将其存储在执行上下文中?我不明白你定义tasklet的范围是什么意思,你能澄清一下吗?当您说“在小任务之间传递参数”时,您是指特定工作中的小任务吗? (如“step1tasklet”、“step2tasklet”等?)
猜你喜欢
  • 2014-12-10
  • 2015-11-25
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多