java - 使用步骤决定器和 block 时的 Spring 批处理

标签 java spring-batch

我开始使用 Spring Batch,但我有一个关于何时使用步骤、决策程序和 block 的问题。

给定以下输入:

<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>

对于文件中的每个 <UserAuthorization> ,我将根据 <Action> 在数据库上执行查询之前验证不同的业务规则。 (例如:对于 ADD,验证 UserName 在数据库中是唯一的并且仅由字母组成,或者对于 DELETE,验证 id 在表中存在)

然后 <Action> 值将确定我是否需要在数据库中插入、更新或删除某个值。 (操作可以具有其他值,例如 UPDATE_RIGHTS 或 RESET_PASSWORD)

最好做什么?

我是否定义这样的工作:

<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 文件并一次返回一个 <UserAuthorization>
  • itemProcessor 将充满 if ,以根据当前项目的 <Action> 值验证业务规则
  • itemWriter 会将项目保留在数据库中。如果我想在执行查询之前执行更多操作,是否还需要在此处添加逻辑?

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

这样做正确吗?

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

最佳答案

使用 SB 来解决此类问题是正确的决定,您不需要多于一个步骤(对于此用例)。

第一个解决方案:
读取器很简单(使用 StaxEventItemReader ),处理器毫无用处(除非您需要执行一些业务检查)。
更有趣的一点是作者,因为你必须:

  1. 为执行实际写入逻辑的每个操作(例如 AddItemWriter, UpdateItemWriter, DeleteItemWriter)定义一个自定义编写器
  2. 创建一个主要编写器(由专门编写器组成),您可以根据 <ACTION> 将写入分派(dispatch)给正确的编写器标签值。

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

  1. 标准StaxEventItemReader
  2. 自定义 ItemProcessor<UserAuthorization> 转换定制Action类封装操作(AddUserAuth, DeleteUserAuth, UpdateUserAuth为例)
  3. 为执行实际写入逻辑的每个操作(例如 AddItemWriter, UpdateItemWriter, DeleteItemWriter)定义一个自定义编写器
  4. 作为主要作者,使用 ClassifierCompositeItemWriter基于SubclassClassifier ;该分类器使用自定义类 Action 分派(dispatch)给正确的编写器从处理器创建

此解决方案比解决方案一更(容易)扩展,因为您只需要创建自定义 Action类 - 和正确的编写器 - 对于(新)操作和编写只是一个配置问题。

关于java - 使用步骤决定器和 block 时的 Spring 批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23513113/

相关文章:

spring - 最佳 Spring 批量扩展策略

javascript - 跨平台Ajax上传不起作用

java - 在oracle中合并BLOB数据

java - TIBCO ems 超出队列限制

java - 使用 Java 获取 MySQL 输出的列数

java - Spring批量配置

spring-boot - Spring Batch Java Config JobLauncherTestUtils

java - 使用 gson 将新属性添加到特定 json 节点

spring-batch - 如何使用决策器终止 Spring Batch Split Flow 中的 Step

spring-batch - 读取平面文件时,多线程步骤如何在内部工作?