当前位置: 首页 > 知识库问答 >
问题:

Spring批次架构

云令
2023-03-14

你好

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

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

>

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

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

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

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

    亲切的问候

    托托

  • 共有2个答案

    许照
    2023-03-14

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

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

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

    < code > GenericApplicationContextFactory 创建子应用程序上下文。您可以在父应用程序上下文中拥有“全局”beans。

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

    是的,但没那么容易。

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

    JobExecutionDecider可能是最好的选择。

    慕嘉运
    2023-03-14

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

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

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

    Spring Batch是否为此提供了设施?不,你必须自己编写代码。

    还要注意,您必须将定义存储在自己的表中(Spring Batch定义的模式没有用于此的表)。

    今天,在特定时间段,我们同时执行数百个作业。他们还重用了数据库的连接池。旧的Spring Batch ref文档声明JobFactory将为每个作业执行创建新的ApplicationContext。如果Spring Batch是这种情况,我们如何实现连接池的重用呢?

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

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

    这实际上是一个编排问题。按照设计,Spring Batch没有考虑作业的编排。这允许你按照你想要的方式编排它们。

    我推荐的处理方式是通过Spring XD或者(取决于你的时间表)Spring Cloud数据流。这些工具提供了编排功能,包括在作业停止时重新部署作业。也就是说,如果失败,它不会重新启动正在运行的作业,因为这通常需要基于用例的某种形式的人工决策。然而,Spring XD目前(以及Spring Cloud Data Flow将会)有能力以非常直接的方式实现这样的东西。

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

    在这种情况下,我会开始质疑您的作业是如何配置的。您可以使用<code>JobExecutionDecider

    考虑到所有因素,虽然您可以使用Spring Batch完成大部分所需内容,但使用Spring XD或Spring Cloud Data Flow之类的东西将使您的生活更加轻松。

     类似资料:
    • 我们正在从Oracle DB迁移到Azure SQL Server,用于我们的Spring批处理应用程序。 我断断续续地得到以下错误 错误:01.03.2022:1458(40.269)[]main]命令行JobRunner:作业因错误而终止:创建名为“dateStoreList”的bean时出错:设置bean属性“jobRepository”时无法解析对bean“jobRepository”的引

    • 我需要根据工作步骤1中的某些条件来决定下一步调用哪个步骤。 请注意:在步骤1中,我使用的是纯tasklet方法。例子: 请帮助,我如何在示例tasklet中放入一些代码或进行一些配置以决定调用的下一步? 我已经调查过https://docs.spring.io/spring-batch/reference/html/configureStep.html

    • 本文向大家介绍Spring batch批处理框架,包括了Spring batch批处理框架的使用技巧和注意事项,需要的朋友参考一下 spring batch框架的简介 批处理任务是大多数IT项目的一个重要组成部分,批处理在业务系统中负责处理海量的数据,无须人工干预就能够自动高效的进行复杂的数据分析和处理。批处理会定期读入批量数据,经过相应的业务处理进行归档的业务操作,批处理的特征是自动执行,处理的

    • 我们正在使用Spring云流霍克斯顿。SR4使用来自Kafka主题的消息。我们启用了spring.cloud.stream.bindings.。consumer.batch-Mode=true,每次轮询获取2000条记录。我想知道是否有一种方法可以手动确认/提交整个批次。

    • 按照标题,我有一个使用spring Batch在后端运行的服务。 我的服务: 作业已停止,但控制台中仍输出文本: 我不知道如何在作业停止时停止-method。我怎么做?

    • 我们已经使用eclipse构建了一个spring批处理应用程序。每当我通过eclipse执行程序时,它都运行良好。但当我尝试生成并运行使用ant创建的jar文件时,我得到了这个丑陋的堆栈跟踪。 2012年12月27日11:10:30880 1141[主][]错误(CommandLineJobRunner.java:355):作业因错误而终止:类路径资源[启动上下文.XML]的XML文档中的第12行