JBeret中ItemWriter抛可跳过异常时旧事务内触发新块的问题
JBeret块事务与ChunkListener执行行为疑问
我使用JBeret执行一个基于单块步骤的简单作业,该作业从数据库读取条目、处理并更新数据。步骤还定义了一个与数据库交互的ChunkListener,以及一组可跳过异常类。作业配置示例如下:
<job id="testJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0"> <step id="test"> <listeners> <listener ref="someChunkListener"/> </listeners> <chunk item-count="1" > <reader ref="testReader" /> <processor ref="testProcessor"/> <writer ref="testWriter"/> <skippable-exception-classes> <include class="java.lang.IllegalStateException"/> </skippable-exception-classes> </chunk> </step> </job>
观察到的执行流程:
- 为块启动事务
- 触发
someChunkListener的beforeChunk方法 - 触发ItemReader
- 触发ItemProcessor
- 触发ItemWriter并抛出
IllegalStateException - 触发
someChunkListener的beforeChunk方法 - 在新块中触发ItemReader
...
我发现异常的是,步骤5和6之间未启动新事务,但新块已启动/块已重启。我查阅了JSR-352规范,未找到此类行为的描述;查看JBeret的ChunkRunner实现,发现阻止启动新事务是有意设计的。
我认为这种情况下,要么不应调用beforeChunk回调(继续同一块),要么应为新块启动新事务。我担忧基于块的作业缺乏明确的事务边界定义,该如何处理可能的脏事务(如部分写入项、ChunkListener的更新,甚至通过XA事务发送JMS消息)?
该行为是否在JBeret文档中有描述?这是Bug还是我遗漏了JSR-352的特定内容?
内容的提问来源于stack exchange,提问作者Андрей Андреев
相关产品推荐
相关产品推荐

