Spring 个批处理步骤的不同组合
Different combination of Spring batch steps
我正在开展一个项目,我将在其中使用 Spring 批处理和 Spring 集成来创建工作流系统。这个工作流系统应该能够从队列中读取消息,这实际上是来自客户端的作业请求,并且根据作业请求类型,我需要调用一些 7-8 个系统。
每个系统从某个位置读取输入文件(通常是一个集中式存储系统,所有输入文件都存储在客户端提交的位置),对其进行处理,然后将其传递给下一个系统,最终我应该能够给出对客户端的响应,如果所有系统成功处理它,则为 SUCCESS;如果任何系统未能处理该文件,则为 FAILED;如果失败,则客户端应该能够从实际失败的步骤重新启动失败的作业。
我将添加每个系统作为 Spring 批处理中的一个步骤,然后使用 Spring 集成我将对系统特定流程进行建模 - 例如FTP 获取文件,发送 JMS/SMAPI 请求,接收 JMS 响应,返回 FTP 文件。等等
我的问题是:
- 这是正确的方法吗?
- 如果 "yes",使用 Spring 批处理和 Spring 集成时性能调整注意事项是什么?
- 由于不会一直以相同的顺序调用所有系统,如何使用 Spring 批处理作为潜在的 Spring 批处理作业编写所有可能的组合?
问题一:
一起使用 Spring-Integration 和 Spring-Batch 是个好主意。
问题二:
使用 Spring-Batch,您有很多选项可以扩展,从而提高性能。您可以并行启动整个作业,可以并行执行步骤,可以并行执行块...基本问题是:
- 瓶颈在哪里
- 并行化在哪些方面提高了性能
问题三:
基本上,Spring-Batch 不是一个工作流系统。它支持具有固定步骤顺序的作业。
选项 1:您可以在每个系统各自的工作中为每个系统建模 ("jobSystemA"、"jobSystemB")。这样,您就可以在 "integration" 层中实现流程逻辑,并以正确的顺序为每个系统启动一个新作业。
选项 2:如果您有固定数量的可能流程,例如
Flow 1:
Step A (System A)
Step B (System B)
Step C (System C)
Flow 2:
Step A (System A)
Step C (System C)
Step B (System B)
您可以为每个可能的 "Flow" 定义一个作业,并将对特定系统作业的调用实现为 "StepJob",它调用选项 1 中提到的特定 "jobSystem"-作业;像
JobFlow1
Step1 {JobStep call jobSystemA}
Step2 {JobStep call jobSystemB}
Step3 {JobStep call jobSystemC}
JobFlow2
Step1 {JobStep call jobSystemA}
Step2 {JobStep call jobSystemC}
Step3 {JobStep call jobSystemB}
选项 3:如果您使用 SpringBatch 的流畅 API 以编程方式定义您的作业,您可以自由创建一个因此在运行时定义作业。
我正在开展一个项目,我将在其中使用 Spring 批处理和 Spring 集成来创建工作流系统。这个工作流系统应该能够从队列中读取消息,这实际上是来自客户端的作业请求,并且根据作业请求类型,我需要调用一些 7-8 个系统。
每个系统从某个位置读取输入文件(通常是一个集中式存储系统,所有输入文件都存储在客户端提交的位置),对其进行处理,然后将其传递给下一个系统,最终我应该能够给出对客户端的响应,如果所有系统成功处理它,则为 SUCCESS;如果任何系统未能处理该文件,则为 FAILED;如果失败,则客户端应该能够从实际失败的步骤重新启动失败的作业。
我将添加每个系统作为 Spring 批处理中的一个步骤,然后使用 Spring 集成我将对系统特定流程进行建模 - 例如FTP 获取文件,发送 JMS/SMAPI 请求,接收 JMS 响应,返回 FTP 文件。等等
我的问题是:
- 这是正确的方法吗?
- 如果 "yes",使用 Spring 批处理和 Spring 集成时性能调整注意事项是什么?
- 由于不会一直以相同的顺序调用所有系统,如何使用 Spring 批处理作为潜在的 Spring 批处理作业编写所有可能的组合?
问题一: 一起使用 Spring-Integration 和 Spring-Batch 是个好主意。
问题二: 使用 Spring-Batch,您有很多选项可以扩展,从而提高性能。您可以并行启动整个作业,可以并行执行步骤,可以并行执行块...基本问题是:
- 瓶颈在哪里
- 并行化在哪些方面提高了性能
问题三: 基本上,Spring-Batch 不是一个工作流系统。它支持具有固定步骤顺序的作业。
选项 1:您可以在每个系统各自的工作中为每个系统建模 ("jobSystemA"、"jobSystemB")。这样,您就可以在 "integration" 层中实现流程逻辑,并以正确的顺序为每个系统启动一个新作业。
选项 2:如果您有固定数量的可能流程,例如
Flow 1:
Step A (System A)
Step B (System B)
Step C (System C)
Flow 2:
Step A (System A)
Step C (System C)
Step B (System B)
您可以为每个可能的 "Flow" 定义一个作业,并将对特定系统作业的调用实现为 "StepJob",它调用选项 1 中提到的特定 "jobSystem"-作业;像
JobFlow1
Step1 {JobStep call jobSystemA}
Step2 {JobStep call jobSystemB}
Step3 {JobStep call jobSystemC}
JobFlow2
Step1 {JobStep call jobSystemA}
Step2 {JobStep call jobSystemC}
Step3 {JobStep call jobSystemB}
选项 3:如果您使用 SpringBatch 的流畅 API 以编程方式定义您的作业,您可以自由创建一个因此在运行时定义作业。