2015-08-16 116 views
2

所以就像标题所说的那样,整个批处理作业到底如何与Spring Batch一起使用?我明白(当然,如果我错了,请纠正我)有一个存储作业的存储库,然后每个作业都有步骤,每个步骤都是一个tasklet或ItemReaders和ItemProcessors的组合,随后是ItemWriter一块已经填满了。春季批次:执行一项工作究竟如何到齐?

我不明白究竟怎么这一切看起来,在实际的代码;我一直在阅读文档并查看示例,但我已经无法弥补。我甚至可以告诉工作在何时/何地运行?有几百万个以“Job”开头的类,我怎么最少使用它们来存储我定义的作业,然后在何时何地运行它们?另外,我看到的所有示例都是完全/基于XML的,但我想尽可能使用尽可能少的XML。

我困惑的另一大问题,就是究竟是ItemReader /处理器/作家知道他们正在使用的物品是什么项目/块的?不要太想象我自己实现了一个ItemProcessor,为此,我显然需要访问它正在处理的项目,或者为ItemWriter,我想访问该块它想写的项目。

+0

*何时执行*不是Spring Batch的一部分,因为它使用定时器或石英库。我也想知道你是否真的看了一下'ItemReader','ItemWriter'和'ItemProcessor'的javadoc,它向你展示了API并解答了你的问题。 –

+0

是的我从实际的答案中知道这些类的文档回答了我的问题的一部分。这些文档似乎还不能说明我如何通过使用tasklets作为步骤来传递和访问具有作业的对象。 – rawa

回答

1

回答你的问题的基础 -

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

像春天你的应用环境只需要知道你的工作的定义,因为它需要了解bean定义的加载。

Which job to execute:作业定义的标识被使用。要执行对于第一步骤,JobExecutionDecider可以使用其他使用的下一个属性将与下一工序的ID被用于:
Which step to execute in Job
What is there in a step:读取器读取数据,处理器对获取的数据进行处理,最后写入器写入数据。如果step执行的操作不是在tasklet中定义的。

+0

那么,tasklet如何跟踪它正在处理的内容呢?假设我想给工作提供多个对象的输入(通过列表),我甚至可以首先传递对象,然后我将如何访问它们以便我可以对它们做什么? – rawa

+0

您可以将列表或任何其他对象存储在作业执行上下文中,并将tasklet的作用域定义为步骤,这些存储的数据可以在任何其他tasklet中检索。有关如何在小工具之间传递参数的问题,请参阅我的回答。 –

+0

如果作业执行不存在,直到我调用作业才能运行,那么在作业运行之前我该如何存储在执行上下文中?我不明白你定义tasklet的范围是什么意思,你能澄清一下吗?当你说“在tasklets之间传递参数”时,你的意思是特定工作中的tasklets吗? (像“step1tasklet”,“step2tasklet”等?) – rawa

2

Mkyong.com有一些不错的春天batch tutorials这给的什么工作实际配置看起来像一些比较明显的例子。请参阅基本示例here。不幸的是,这些例子大部分都是XML。下面是一个blog post的例子,使用java配置。

根据物品读取器/处理器/写入器类型的步骤。你通常会有一个阅读器和至少一个处理器/写入器组合。两者都不是必需的。

就理解每一个而言,检查接口 - 它们可能有助于为您清理它。例如,这里有一个ItemWriter接口:

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

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

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

+0

好吧,现在如果我为我的步骤使用一个tasklet,那么tasklet如何访问作业要处理的项目呢? – rawa