我们有一个使用弹簧批的现有应用程序。根据新的要求,我们需要通过从mongo db读取它来向cassandra db写一行,然后将mongo db中的status列更新为true,表示行已处理。
我正在使用driver-cassandra-core库将数据写入Cassandra和spring-data-mongodb以更新mongo db中的数据。
所以现在我正在考虑将数据写入cassandra,然后在ItemWriter(spring-batch)中更新mongo中的状态,我认为这应该可以在愉快的场景中正常工作。
但我不确定如果应用程序出现问题,如果db(cassandra或mongo)出现故障或应用程序在处理过程中出现故障等问题是否可行。所以我想在此处添加事务管理器以确保应用程序能够回滚未处于一致状态的行。我已经看到可以添加如下所示的事务管理器:
https://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html#configuringAStep
但我不确定因为我使用的是两个不同的No SQL数据库,是否可以让这个事务管理器工作以确保?
有人可以告诉我处理这种情况的正确方法是什么?
PS :只是更新它对于应用程序保持cassandra和mongo状态同步非常重要,即如果应用程序将数据写入cassandra然后相应的行状态应该在mongo中更新。
答案 0 :(得分:1)
我不能和Cassandra说话,但我相信MongoDB不会参与由PlatformTransactionManager
管理的交易。因此,您将需要使用侦听器来实现补偿逻辑以模拟回滚。我建议使用CompositeItemWriter
来写入两个数据源,然后使用ChunkListener#afterChunkError
来实现补偿逻辑来模拟错误的回滚。