【问题标题】:Spring Batch architectureSpring Batch 架构
【发布时间】:2016-05-30 07:19:48
【问题描述】:

我是 Spring Batch 领域的新手,最近几天我花时间观看了 Michael Minella 的 youtube 视频,阅读了一些文档并成功运行了我在 Internet 上找到的一些演示项目。我认为 Spring Batch 是满足我们需求的热门人选。但这是我们的故事。

我在一家公司工作,该公司十多年前为其业务部门开发了自己的调度和批处理框架。该框架能够运行 DB 存储过程、DB 函数和动态 SQL。不用说,维护它非常具有挑战性,因为太多具有各种开发技能的人进行了编码,他们不再在这里工作。我们的框架可以处理作业和步骤以顺序运行以及异步(如 Spring Batch)。我们还有一个作业存储库,我们存储整个作业定义(用户通过 GUI 创建新作业)、作业实例及其上下文(以防服务器宕机,当服务器启动时,它将恢复运行作业)。 我的问题如下:

  1. 我们能否动态创建新的 Spring Batch 作业(通过 XML og 代码)并通过标准 SB 接口将它们存储到 JobRepository DB 中?

  2. 今天,在某个时间段,我们同时执行了多达数百个作业。他们还重用了数据库的连接池。 Older Spring Batch ref documentation 声明 JobFactory 将为每个作业执行创建新的 ApplicationContext。如果在 Spring Batch 中出现这种情况,我们如何实现连接池的重用。

  3. 我知道支持继续失败的步骤,但如果服务器/应用程序出现故障,我是否能够重新启动我的应用程序并从 JobRepository 检索作业实例及其上下文,以便从失败的步骤继续?

  4. “job1”中的“step1.1”能否依赖于“job2”中的“step 2.1”在最后一小时内完成?在这种情况下,我可能会在“step1.1”上使用步骤侦听器来完成此操作?


亲切的问候

多多

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    这里有很多材料要介绍,所以让我一次回答一点:

    我们能否动态创建新的 Spring Batch 作业(通过 XML 或代码)并通过标准 SB 接口将它们存储到 JobRepository DB 中?

    您可以动态生成作业定义吗?是的。我们在 Spring XD 中针对作业编排部分执行此操作(例如,组合作业 DSL 用于生成 XML 文件。

    Spring Batch 是否提供了执行此操作的工具?不,您必须自己编写代码。

    另请注意,您必须将定义存储在自己的表中(Spring Batch 定义的架构没有用于此的表)。

    今天,在某个时间段,我们同时执行了多达数百个作业。他们还重用了数据库的连接池。较早的 Spring Batch 参考文档指出 JobFactory 将为每个作业执行创建新的 ApplicationContext。如果在 Spring Batch 中出现这种情况,我们如何实现连接池的重用。

    您可以使用父/子上下文配置来重用 bean,包括 DataSource。在父上下文中定义DataSource,然后在子上下文中定义依赖它的作业。

    我知道支持继续失败的步骤,但是如果服务器/应用程序出现故障,我是否能够重新启动我的应用程序并从 JobRepository 检索作业实例及其上下文,以便从失败的步骤继续?

    这确实是一个编排问题。 Spring Batch 在设计上并未考虑到作业的编排。这使您可以按照自己的意愿编排它们。

    我建议的处理方式是通过Spring XD 或(取决于您的时间线)Spring Cloud Data Flow。这些工具提供编排功能,包括在作业出现故障时重新部署作业。话虽如此,如果它失败,它不会重新启动正在运行的作业,因为这通常需要基于用例的某种形式的人工决策。然而,目前的 Spring XD(以及 Spring Cloud Data Flow 将)有能力以一种非常直接的方式实现类似的东西。

    “job1”中的“step1.1”能否依赖于“job2”中的“step 2.1”在最后一小时内完成?在这种情况下,我可能会在“step1.1”上使用步骤侦听器来完成此操作?

    在这种情况下,我会开始质疑您的工作是如何配置的。您可以使用JobExecutionDecider 来决定是否应该执行某个步骤,如果它仍然有意义的话。

    考虑到所有因素,虽然您可以使用 Spring Batch 完成大部分您正在寻找的事情,但使用 Spring XD 或 Spring Cloud Data Flow 之类的东西会让您的生活更轻松。

    【讨论】:

    • 感谢您的答案和提示。只是一个快速跟进的问题,是否可以同时执行数百个作业,即。在性能方面有这么多的 ApplicationContexts(一次从不使用多个)?
    • 在单个JVM还是多个?
    • 单个 JVM。我还想问一件事。 Spring Batch 是否默认异步执行作业?当我使用 org.springframework.core.task.SimpleAsyncTaskExecutor 时,我看到了它,例如:<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> <property name="taskExecutor"> <bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" /> </property> </bean>
    • 单个 JVM...这取决于很多事情。我会说尝试相应地调整。至于异步作业执行,默认情况下作业执行是同步的,但正如您所指出的,您可以根据需要将其配置为异步。
    • 非常感谢迈克尔。顺便说一句,你的 youtube 视频和你的书“Pro Spring Batch”做得很好。
    【解决方案2】:

    我们能否动态创建新的 Spring Batch 作业(通过 XML og 代码)并通过标准 SB 接口将它们存储在 JobRepository DB 中?

    使用StepBuilderFactoryFlowBuilder 等以编程方式构建 Spring Batch 工件很容易。您可能希望使用 Spring Beans 支持这些工件(以获得良好的设施,如步骤/作业弹簧范围、注入等),为此您可以使用原型、执行范围和作业范围 bean,甚至使用诸如此类的设施作为BeanDefinitionBuilder 动态创建bean。

    较早的 Spring Batch 参考文档指出 JobFactory 将为每个作业执行创建新的 ApplicationContext。如果在 Spring Batch 中出现这种情况,我们如何实现连接池的重用。

    GenericApplicationContextFactory 创建一个子应用程序上下文。您可以在父应用程序上下文中拥有“全局”bean。

    我知道支持继续失败的步骤,但如果服务器/应用程序出现故障,我是否能够重新启动我的应用程序并从 JobRepository 检索作业实例及其上下文,以便从失败的步骤继续?

    是的,但是not that easily

    “job1”中的“step1.1”能否依赖于“job2”中的“step 2.1”在最后一小时内完成?在这种情况下,我可能会在“step1.1”上使用步骤侦听器来完成此操作?

    JobExecutionDecider 可能是那里的最佳选择。

    【讨论】:

    • 您提到使用 FlowBuilder 和 StepBuilderFactory 可以很容易地动态创建作业。你能提供一个代码示例吗?在 JobRepository 中存储作业定义的第二部分怎么样(我看不到任何包含这些定义的表)?
    • 作业定义未存储在数据库中。至于StepBuilderFactoryFlowBuilder的用法看文档。对于一个非常基本的想法,请查看here
    • 使用 StepBuilderFactory/FlowBuilder 时,我需要生成一个可以序列化到数据库的作业定义。这是可以实现的吗?顺便说一句,在表 italic_batch_job_execution_italic 中有一个名为 italic_JOB_CONFIGURATION_LOCATION_italic 的 NULL 值列。从名称上看,它似乎是作业定义 (XML) 的路径?
    • @TotoKotunjo 看源码,好像只用于JSR-352作业中的作业重启。是的,它是 XML 定义的路径。在您的情况下,该列将是空白的。
    • 嗯,所以 JSR-352 支持存储作业定义的路径,但 SB 实现不支持?只是重复我关于 StepBuilderFactory/FlowBuilder 的另一个问题,他们是否能够将作业定义生成为 XML(由 spring-batch.xsd 指定),以便它可以存储在自定义表中,然后由 SB 执行?
    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多