使用步骤决策者和块时的Spring批处理

时间:2014-05-07 08:52:26

标签: java spring-batch

我开始使用Spring Batch,我对使用步骤,决策者和块时有疑问。

给出以下输入:

<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>值将确定我是否需要INSERT,UPDATE或DELETE数据库中的值。 (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批处理。

这是正确的做法吗?

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

2 个答案:

答案 0 :(得分:3)

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

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

  1. 为执行实际写入逻辑的每个操作(例如AddItemWriter, UpdateItemWriter, DeleteItemWriter)定义自定义编写器
  2. 创建一个主编写器(由专门的编写器组成),您可以根据<ACTION>标记值向正确的编写者发送写入。
  3. 第二种解决方案(可能更复杂一点):

    1. 标准StaxEventItemReader
    2. 自定义ItemProcessor<UserAuthorization>转换为自定义Action类封装操作(例如AddUserAuth, DeleteUserAuth, UpdateUserAuth
    3. 为执行实际写入逻辑的每个操作(例如AddItemWriter, UpdateItemWriter, DeleteItemWriter)定义自定义编写器
    4. 作为主要作者使用基于ClassifierCompositeItemWriter的{​​{1}};此分类器使用从处理器
    5. 创建的自定义SubclassClassifier类调度到右侧编写器

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

答案 1 :(得分:0)

Spring Batch在这里看起来有点过分。但如果使用,我希望以下分工:

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

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