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

使用步骤决定器和块时的Spring批处理

郝池暝
2023-03-14

我开始使用Spring批处理,我有一个关于何时使用步骤、决策器和块的问题。

考虑到以下输入:

<UserAuthorizationEvent>
    <UserAuthorization>
        <Action>ADD</Action>
        <UserName>Name1</UserName>
        <!-- more properties here -->
    </UserAuthorization>
    <UserAuthorization>
        <Action>UPDATE</Action>
        <UserId>456</UserId>
        <UserName>NewName2</UserName>
        <!-- more properties here -->
    </UserAuthorization>
    <UserAuthorization>
        <UserId>789</UserId>
        <Action>DELETE</Action>
    </UserAuthorization>
    <!-- 1000 or more UserAuthorization here -->
</UserAuthorizationEvent>

对于每个

然后是<代码>

最好的做法是什么?

我是否这样定义一份工作:

<job id="myJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="step1">
        <tasklet>
            <chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" commit-interval="2" />
        </tasklet>
    </step>
</job>
  • itemReader将读取xml文件并返回

这样做,我担心我没有正确使用Spring批处理。

这样做对吗?

我可以使用几个步骤和决定器来实现批处理的所有逻辑吗?你有一些例子吗?


共有2个答案

东郭昌胤
2023-03-14

Spring的一批看起来有点过头了。但如果使用,我预计会出现以下分工:

  • itemReader从输入源读取项,并返回下一个要处理的项。这个类必须是线程安全的。
  • 项目处理器只返回输入项。如果有关于操作的业务规则,它们就属于这里。这个类不需要是线程安全的,因为它是在自己的线程中调用的。这个类不应该写入数据库。
  • itemWriter执行插入/更新/删除操作,并在块大小操作后提交。

另外,我怀疑ADD操作不会有userId。这通常是在插入记录时由数据库分配的。

龙星辰
2023-03-14

使用SB解决这类问题是正确的决定,你只需要一个步骤(对于这个用例)。

第一个解决方案:
读卡器很简单(使用StateVentitemReader),处理器也没用(除非你需要执行一些业务检查)
更有趣的是作者,因为你必须:

  1. 为执行实际写入逻辑的每个操作(例如addItemWriter, UpdateItemWriter, DeleteItemWriter)定义一个自定义写入器
  2. 创建一个主写入器(由专门的写入器组成),您可以根据将写入发送到正确的写入器

第二种解决方案(可能更“复杂”):

  1. 标准statxeventitemreader

这个解决方案比解决方案一更容易扩展,因为你只需要为一个(新的)动作创建自定义的动作类,以及合适的编写器,编写只是一个配置问题。

 类似资料:
  • 我正在尝试为分区配置Spring批处理步骤。这里很好的示例显示了一个关于“ID范围”的分区,但我不知道如何从“数据页”范围开始。 在我的顺序步骤中,我有: null

  • 我目前正在处理一批数据,这些数据来自一个拥有数百万行的大型SQL数据库。 它在处理器中执行一些处理,包括通过带有连接的大型sql查询对从Reader检索到的行进行分组。 编写器将结果写入另一个表。 问题是此Batch存在性能问题,因为Sql选择查询需要大量时间并且步骤不会在多线程中执行。 因此,我希望在多标题中运行它们,但问题是,这些步骤通过计算具有相同类型的所有行的总数来对行进行分组。 因此,如

  • 我有一个作业步骤,从数据库读取并将输出写入平面文件,然后创建一个报告。 如果该步骤失败,我希望它重新启动,从头开始处理。我不想将任何恢复合并到这一步中。 实现Spring Batch的最佳方式是什么,这样该tasklet就不会在过程中执行任何块处理并触发恢复?

  • 我第一次使用Spring batch,我需要一些关于验证步骤的帮助。 在真正开始我的批处理作业之前,我需要对要处理的文件进行一些验证,例如: 使用数据库中的信息检查名称 使用来自系统和数据库的信息检查第一行和最后一行(特定) 用第一行中的数据检查总行号 在那之后,我真的可以开始我的批处理工作了。 我认为有多个步骤相互链接,第一步进行验证,如果文件无效,则进入错误步骤。 我如何进行验证?所有找到的阅

  • 我需要访问两个数据源: Spring批处理存储库:在内存H2中 我的步骤需要访问。 我在那里看到了几个关于如何创建自定义

  • 我正在尝试修复Spring Batch中的一个问题,这个问题最近一直困扰着我们的系统。我们有一份工作,在大多数情况下都很好。下载和处理数据是一个多步骤的工作。 问题是有时工作会爆棚。也许我们试图连接到的服务器抛出了错误,或者我们在工作进行到一半时关闭了服务器。此时,下次我们的quartz调度程序尝试运行该作业时,它似乎什么也不做。以下是此作业定义的删节版本: 委婉地说,我是Spring Batch