2015-07-21 32 views
2

我想围绕Spring批处理我的头,虽然很多教程显示了很好的代码示例,但我觉得我错过了“spring批处理引擎”的工作原理。Spring批处理 - 这个过程在哪里运行

场景1 - 创建用户时,在外部服务处创建用户。

  1. Web请求
  2. CreateLocalUser()
  3. 推出工作CreateExternalUser()

CreateExternalUser()可能会失败的,因为很多的原因,所以我们希望能够重试和记录错误, Spring Batch可以为我们做什么。这也是一个与我们的本地用户创建无关的解耦过程。

工作在哪里运行?它是否会与web请求运行在同一线程中,这意味着最终用户在获取http状态200之前必须等待作业完成?

想象一下,我有一个Web服务器和一个批处理服务器。我希望所有作业都可以在批处理服务器上运行,但作业本身可以从Web服务器启动。春季批可以做到这一点?我是否需要某种类型的队列,我可以从Web服务器写入并从批处理服务器消耗,实际工作将从何处开始?

方案2 - 在巨大文件处理线,开始新的工作对于每个线在大文件

  1. 读取线(1.000.000线)
  2. 用于使用从所述输入参数的每一行开始新的作业文件。

处理1.000.000行很快,并且1.000.000个新作业将或多或少地同时启动。这些运行在哪里?他们是否对初始工作运行异步?我的服务器能够处理所有这些或多或少的同时运行。

附加问题: 是否可以根据作业输入参数查询作业。即方案1,我想在我的网页上使用Id 1234查看本地用户时显示CreateExternalUser作业状态/错误。 CreateExternalUser工作具有输入参数,用户名:1​​234

回答

2

你有几个问题在这里让我们通过他们去一次一个:

哪里工作运行?它是否会与web请求运行在同一线程中,这意味着最终用户在获取http状态200之前必须等待作业完成?

这取决于您的配置。如果你使用默认值,那么是的。这项工作将在同一个线程中运行,用户将被迫等到作业完成才能获得200.这显然不是一个好主意......

这就是为什么Spring Batch的SimpleJobLauncher可以让你注入TaskExecutor。通过配置JobLauncher以使用异步TaskExecutor实现(例如,ThreadPoolTaskExecutor),作业将在不同的线程中执行,从而允许控制器的处理完成。

显然,这是所有在单个JVM,这给我们带来的下一个问题。

我想所有作业批处理服务器上运行,但就业本身可以从Web服务器启动。春季批可以做到这一点?我是否需要某种类型的队列,我可以从Web服务器写入并从批处理服务器消耗,实际工作将从何处开始?

Spring Batch的包含模块称为Spring Batch的整合。此模块提供了各种功能,包括使用消息来启动Spring批处理作业。您可以使用它来建立一个远程“批处理”服务器,您可以从Web服务器与之通信。通信机制是Spring集成通道,因此支持由SI支持的任何消息传递选项(JMS,AMQP,REST等)。

方案2 - 在巨大的文件处理线,每条线
这个场景让我想你会走上错误的道路为您的设计开始新的工作。你能发表一个新的问题来阐述这个用例吗?

其他问题:是否有可能基于作业输入参数
工作参数是用来识别JobInstances和对作业标识的基本查询作业。因此,是的,您可以根据参数确定单个作业运行。

+0

针对场景2的详细说明:http://stackoverflow.com/questions/31558148/spring-batch-process-lines-in-huge-file-start-new-job-for-each-line – heuts

+0

谢谢!看这个https://github.com/spring-guides/gs-batch-processing个人读者,作家,工作和步骤是有道理的。我无法包揽头脑的是工作周围的东西,如果这是春季批次的一部分或我需要管理自己的东西。即说我有10个工作。 3需要消耗AMQP并且一直运行。 3需要每小时运行一次(例如方案2),另外4个我可以在需要时手动启动。我对Spring Batch了解的是如何定义Job的实际逻辑,而不是何时以及如何开始Job。我希望这是有道理的。 – heuts

+0

除此之外。假设我使用Spring Batch Admin连接我的解决方案,并运行消耗AMQP的作业,每个消息都将作为管理中的作业显示出来,还是将消耗的消息显示为一项作业。 – heuts