我试图围绕Spring Batch,虽然很多教程都展示了很好的代码示例,但我觉得我错过了#spring spring引擎"的工作原理。
场景1 - 在创建用户时,在外部服务中创建用户。
CreateExternalUser()可能由于多种原因而失败,因此我们希望能够重试并记录Spring Batch可以为我们做的错误。它也是一个与本地用户创建无关的解耦过程。
工作在哪里?它是否与Web请求在同一个线程中运行,这意味着最终用户必须等待作业完成才能获得http状态200?
想象一下,我有一个Web服务器和一个批处理服务器。我希望所有作业都在批处理服务器上运行,但作业本身可以从Web服务器启动。 Spring Batch可以这样做吗?我是否需要某种可以从Web服务器写入的队列和来自批处理服务器的消费,实际的工作将从哪里开始?
场景2 - 处理庞大文件中的行,为每行开始新作业
快速处理1.000.000行,同时可以或多或少地启动1.000.000个新作业。这些运行在哪里?他们是否与初始工作异步?我的服务器能否同时或多或少地处理所有这些操作。
其他问题: 是否可以根据作业输入参数查询作业。即场景1,我想在我的网页上查看ID为1234的本地用户时显示CreateExternalUser作业状态/错误。 CreateExternalUser作业具有输入参数userId:1234
答案 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
,是工作识别的基础。因此,是的,您可以根据参数识别单个作业运行。