我试图在块的commit-interval属性上使用后期绑定。
当块没有包含skip-policy或retry-policy时,它可以正常工作但是只要添加了skip-policy(甚至是retry-policy),就不会执行commit-interval考虑到并且批处理工作就好像commit-interval设置为1.奇怪的是,当commit-interval是硬编码时,它工作正常......
所以这个配置工作正常:
<chunk reader="multiAccuseReceptionItemReader"
processor="enrichissementPrescriptionItemProcessor"
writer="prescriptionItemWriter"
commit-interval="#{jobExecutionContext['commits']}">
这个也很好用:
<chunk reader="multiAccuseReceptionItemReader"
processor="enrichissementPrescriptionItemProcessor"
writer="prescriptionItemWriter"
skip-policy="skipPolicy"
commit-interval="3">
但是这个没有考虑commit-interval并将其设置为1:
<chunk reader="multiAccuseReceptionItemReader"
processor="enrichissementPrescriptionItemProcessor"
writer="prescriptionItemWriter"
skip-policy="skipPolicy"
commit-interval="#{jobExecutionContext['commits']}">
我尝试使用simpleCompletionPolicy而不是commit-interval来使用completion-policy,但更糟糕的是:当有skip-policy或retry-policy时,chunkSize不会被考虑在内,即使它是硬编码的。如果没有任何skip-policy或retry-policy,则会考虑chunkSize(硬编码或后期绑定)。
我使用的是Spring Batch 2.2.0(并且无法改变)。
为什么会这样? 如何使用skip-policy和retry-policy动态设置commit-interval?
答案 0 :(得分:2)
这是类org.springframework.batch.core.configuration.xml.StepParserStepFactoryBean中的一个已知的spring-batch错误:https://jira.spring.io/browse/BATCH-2096。
版本2.2.2中已更正。
所以最好的解决方案是升级到spring-batch的v2.2.2(与2.2.0相同,并修正了一些错误)。
如果 - 像我一样 - 你真的无法升级,那么最好的方法是从git (tag 2.2.2)复制org.springframework.batch.core.configuration.xml.StepParserStepFactoryBean类,将它添加到你的来源和确保在类路径中的spring-batch-core jar之前加载了源代码。