我开始使用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>
<UserAuthorization>
。if
个来验证当前项目的业务规则,具体取决于其<Action>
值通过这样做,我担心我没有正确使用Spring批处理。
这是正确的做法吗?
我可以使用几个步骤和决策者来实现批处理的所有逻辑吗? 你有一些例子吗?
答案 0 :(得分:3)
使用SB来解决这类问题是正确的决定,您不需要多于一个步骤(针对此用例)。
第一个解决方案:
读取器很简单(使用StaxEventItemReader
)并且处理器无用(除了您需要执行一些业务检查)。
更有意思的是作者,因为你必须:
AddItemWriter, UpdateItemWriter, DeleteItemWriter
)定义自定义编写器<ACTION>
标记值向正确的编写者发送写入。第二种解决方案(可能更复杂一点):
StaxEventItemReader
ItemProcessor
从<UserAuthorization>
转换为自定义Action
类封装操作(例如AddUserAuth, DeleteUserAuth, UpdateUserAuth
)AddItemWriter, UpdateItemWriter, DeleteItemWriter
)定义自定义编写器ClassifierCompositeItemWriter
的{{1}};此分类器使用从处理器SubclassClassifier
类调度到右侧编写器
醇>
这个解决方案比解决方案更容易(更容易)扩展,因为你只需要创建自定义Action
类 - 正确的编写器 - 用于(新)操作和写入只是一个配置问题。
答案 1 :(得分:0)
Spring Batch在这里看起来有点过分。但如果使用,我希望以下分工:
另外,我怀疑ADD操作没有userId。这通常是在插入记录时由数据库分配的。