事务在Spring批处理中未回滚。我有意抛出异常来测试事务回滚。即使从项目编写器引发异常,数据库事务也在提交。下面是写入器中保存到DB中的方法。对象是注入到此类中的 jpa 存储库
private void writeCEs(Map> agentMap) throws FailedCompensationException, Exception { for (Entry> agent : agentMap.entrySet()) { agent.getValue().stream().forEach((ce) -> { compEvent.save(ce); }); updateRecordFileStatus(agent.getKey()); //postToAccounting(agent.getKey(), agent.getValue()); } throw new Exception("Testing XA roolback.... "); }
我尝试用@Transactional(传播=Propagation.REQUIRES_NEW, rollbackFor=Exception.class)标记上述方法的事务,但它仍然在提交事务。我肯定我错过了一些东西。任何帮助都将不胜感激。
下面是我的批量配置
@EnableBatchProcessing @EnableTransactionManagement @Configuration @ComponentScan({ "com.pm.*" }) public class TrueBatchConfig extends DefaultBatchConfigurer { @Autowired private JobBuilderFactory jobs; @Autowired private StepBuilderFactory steps; @Autowired EventReader reader; @Autowired private EventProcessor processor; @Autowired private EventWriter writer; @Bean protected Step step1(ThreadPoolTaskExecutor executor) { DefaultTransactionAttribute attribute = new DefaultTransactionAttribute(); attribute.setPropagationBehavior(Propagation.REQUIRED.value()); attribute.setIsolationLevel(Isolation.DEFAULT.value()); attribute.setTimeout(30); return steps.get("step1")., Map>>chunk(10).reader(reader) .processor(processor).writer(writer).transactionAttribute(attribute).build(); } @Bean(name = "firstBatchJob") public Job job(@Qualifier("step1") Step step1) { return jobs.get("firstBatchJob").start(step1).build(); } }
根据您的配置,Spring Batch未配置为使用您的< code > JpaTransactionManager ,您需要覆盖< code > getTransactionManager ,请参见此处的示例。在您的情况下,应该是这样的:
public class TrueBatchConfig extends DefaultBatchConfigurer {
// ..
@Override
public PlatformTransactionManager getTransactionManager() {
return new JpaTransactionManager(); // TODO set entity manager factory
}
}
关于文章Spring批处理CompositeItemWriter如何管理委托编写器的事务?,对于复合项编写器事务管理,难道不应该将数据源包装在如下所示的事务管理器中吗?没有下面的bean定义,事务管理就无法与Oracle和Hikari CP一起工作。不确定帖子中提供的示例是如何工作的。请澄清
我目前正在编写一个Spring批处理,其中我正在读取一个数据块,并对其进行处理,然后我希望将此数据传递给两个Writer。一个writer将简单地更新数据库,而第二个writer将写入csv文件。 我计划编写自己的自定义编写器,并在customItemWriter中注入这两个ItemWriter,并在customItemWriter的write方法中调用这两个ItemWrite的write方法。这
我必须像这样配置批处理作业流。 XML文件阅读器- 我的定制处理器是这样的 这是一个好的方法吗?我看到了一些CompositeProcess、CompositeWriter的例子,但没有一个适合我的案例。 提前谢谢。
在我的Spring boot和Spring batch应用程序中,我有这样一个步骤: 我的作家是一个空的,如下所示: 现在,在我的处理器中,我有: 问题:由于所有对象都传递给处理器,我可以在处理器本身中处理它们,而不是使用任何转换等,因为我的目的通过使用处理器来解决,这是一个好的做法吗?或者我必须使用作家/自定义作家来完成工作?