Spring Batch - 进程在哪里运行

时间:2015-07-21 11:04:58

标签: java spring spring-batch spring-batch-admin

我试图围绕Spring Batch,虽然很多教程都展示了很好的代码示例,但我觉得我错过了#spring spring引擎"的工作原理。

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

  1. 网络请求
  2. CreateLocalUser()
  3. 启动作业CreateExternalUser()
  4. CreateExternalUser()可能由于多种原因而失败,因此我们希望能够重试并记录Spring Batch可以为我们做的错误。它也是一个与本地用户创建无关的解耦过程。

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

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

    场景2 - 处理庞大文件中的行,为每行开始新作业

    1. 读取大文件中的行(1.000.000行)
    2. 使用文件中的输入参数为每一行开始新作业。
    3. 快速处理1.000.000行,同时可以或多或少地启动1.000.000个新作业。这些运行在哪里?他们是否与初始工作异步?我的服务器能否同时或多或少地处理所有这些操作。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

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

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