Spring 批处理 - 进程在哪里 运行

Spring Batch - where does the process run

我正在努力研究 Spring 批处理,虽然许多教程展示了很好的代码示例,但我觉得我不知道 "spring batch engine" 是如何工作的。

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

  1. 网络请求
  2. 创建本地用户()
  3. 启动作业 CreateExternalUser()

CreateExternalUser() 可能因多种原因而失败,因此我们希望能够重试并记录错误,Spring Batch 可以为我们做到这一点。这也是一个解耦过程,与我们本地用户的创建无关。

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

假设我有一个 Web 服务器和一个批处理服务器。我希望 Batch 服务器上的所有作业 运行,但作业本身可以从 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 的模块。此模块提供各种功能,包括使用消息启动 Spring 批处理作业。您可以使用它来拥有一个远程 "batch" 服务器,您可以从 Web 服务器与之通信。通信机制是 Spring 集成通道,因此支持 SI 支持的任何消息传递选项(JMS、AMQP、REST 等)。

场景 2 - 处理大文件中的行,为每行开始新作业
这种情况让我觉得你的设计走错了路。你能 post 一个详细说明这个用例的新问题吗?

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