首页 文章

Spring Batch架构

提问于
浏览
2

你好

我是Spring Batch世界的新手,最后几天我花时间观看Michael Minella的youtube视频,阅读一些文档并成功运行我在互联网上找到的一些演示项目 . 我认为Spring Batch是我们需求的热门候选人 . 但这是我们的故事 .

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

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

  • 今天,在某个时间段,我们同时有多达数百个工作执行 . 他们还在重用DB连接池 . Older Spring Batch ref documentation状态JobFactory将为每个作业执行创建新的ApplicationContext . 如果在Spring Batch中就是这种情况,我们如何才能实现重用连接池 .

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

  • “job1”中的“step1.1”可以依赖于“job2”在最后一小时内完成的“步骤2.1”吗?在这种情况下,我可能正在使用“step1.1”的步骤监听器来实现这一目标?

亲切的问候

托托

2 回答

  • 0

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

    Can we create new Spring Batch jobs dynamically (either via XML or code) and via standard SB interfaces store them to the JobRepository DB?

    你能动态生成一个工作定义吗?是 . 我们在Spring XD中关于作业编排部分(例如,组合作业DSL用于生成XML文件) .

    Spring Batch是否提供了这样做的设施?不,你必须自己编码 .

    另请注意,您必须将定义存储在您自己的表中(Spring Batch定义的模式没有此表) .

    Today, at certain time period, we have up to hundred of job executions simultaneously. They are also reusing a connection pool to the DB. Older Spring Batch ref documentation states JobFactory will create fresh ApplicationContext for each job execution. How can we achieve reusing connection pools if this is the case in Spring Batch.

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

    I know there is a support for continuing failed steps but what if the server/app goes down, will I be able to restart my app and retrieve job instance with its context from JobRepository in order to continue from failed step?

    这实际上是一个编排问题 . 根据设计,Spring Batch不考虑作业的编排 . 这允许您按照自己的方式编排它们 .

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

    Can a "step1.1" in "job1" be dependent on "step 2.1" from "job2" finishing within last hour? In such scenarios I may be using a step listener on "step1.1" to accomplish this?

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

    所有事情都考虑在内,虽然你可以使用Spring XD或Spring Cloud Data Flow完成大部分你想要的东西,但会让你的生活变得更轻松 .

  • 0

    我们可以动态创建新的Spring Batch作业(通过XML og代码),通过标准SB接口存储JobRepository DB吗?

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

    较旧的Spring Batch ref文档声明JobFactory将为每个作业执行创建新的ApplicationContext . 如果在Spring Batch中就是这种情况,我们如何才能实现重用连接池 .

    GenericApplicationContextFactory 创建子应用程序上下文 . 您可以在父应用程序上下文中使用"global" bean .

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

    是的,但not that easily .

    “job1”中的“step1.1”可以依赖于“job2”在最后一小时内完成的“步骤2.1”吗?在这种情况下,我可能正在使用“step1.1”的步骤监听器来实现这一目标?

    一个 JobExecutionDecider 可能是那里最好的选择 .

相关问题