Spring Batch – 进程在哪里运行

我试图围绕Spring Batch,虽然很多教程都展示了很好的代码示例,但我觉得我很想念“spring batch engine”是如何工作的。

场景1 – 在用户创建时,在外部服务上创建用户。

  1. 网络请求
  2. CreateLocalUser()
  3. 启动作业CreateExternalUser()

由于许多原因,CreateExternalUser()可能会失败,因此我们希望能够重试并记录Spring Batch可以为我们执行的错误。 它也是一个与我们本地用户的创建无关的解耦过程。

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

想象一下,我有一个Web服务器和一个批处理服务器。 我希望所有作业都在批处理服务器上运行,但作业本身可以从Web服务器启动。 Spring Batch可以这样做吗? 我是否需要某种可以从Web服务器写入的队列和来自批处理服务器的消费,实际的工作将从哪里开始?

场景2 – 在巨大的文件中处理行,为每一行开始新的工作

  1. 读取大文件中的行(1.000.000行)
  2. 使用文件中的输入参数为每一行开始新作业。

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

其他问题:是否可以根据作业输入参数查询作业。 即场景1,我想在我的网页上查看ID为1234的本地用户时显示CreateExternalUser作业状态/错误。 CreateExternalUser作业具有输入参数userId:1234

你在这里有几个问题所以让我们一次一个地通过它们:

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

这取决于您的配置。 如果使用默认值,则为是。 该作业将在同一个线程中运行,并且用户将被迫等到作业完成以获得200.这显然不是一个好主意……

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

显然,这都在一个JVM中,这将我们带到您的下一个问题。

我希望所有作业都在批处理服务器上运行,但作业本身可以从Web服务器启动。 Spring Batch可以这样做吗? 我是否需要某种可以从Web服务器写入的队列和来自批处理服务器的消费,实际的工作将从哪里开始?

Spring Batch包含一个名为Spring Batch Integration的模块。 此模块提供各种function,包括使用消息启动Spring Batch Jobs。 您可以使用它来拥有一个可以从Web服务器与之通信的远程“批处理”服务器。 通信机制是Spring Integration通道,因此支持SI支持的任何消息传递选项(JMS,AMQP,REST等)。

场景2 – 在巨大的文件中处理行,为每一行开始新的工作
这种情况让我觉得你的设计走错了路。 你能发一个详细阐述这个用例的新问题吗?

其他问题:是否可以根据作业输入参数查询作业
作业参数用于识别JobInstances ,是作业识别的基础。 因此,是的,您可以根据参数识别单个作业运行。