Spring batch SpringBatch、区块处理和尝试在区块回滚上还原非事务性更改

Spring batch SpringBatch、区块处理和尝试在区块回滚上还原非事务性更改,spring-batch,Spring Batch,我有一个区块处理步骤: 1) 在数据库中创建用户 2) 通过HTTP调用在远程系统上打开帐户 我们为远程系统上的帐户付费,在批处理失败期间,我们希望避免创建永远不会使用的远程帐户,因为用户已在我们的数据库中回滚 如果区块大小为100,那么如果在远程调用第50个项目2)期间发生异常,那么我的业务逻辑可以捕获该异常,尝试关闭该特定项目的远程帐户,然后重新引发异常以触发区块回滚 但是,对于之前处理的第49个项目,将回滚数据库中的用户,但不会关闭帐户 因此,将在DB上回滚50个用户,但只关闭1个远程

我有一个区块处理步骤:

  • 1) 在数据库中创建用户
  • 2) 通过HTTP调用在远程系统上打开帐户
我们为远程系统上的帐户付费,在批处理失败期间,我们希望避免创建永远不会使用的远程帐户,因为用户已在我们的数据库中回滚

如果区块大小为100,那么如果在远程调用第50个项目2)期间发生异常,那么我的业务逻辑可以捕获该异常,尝试关闭该特定项目的远程帐户,然后重新引发异常以触发区块回滚

但是,对于之前处理的第49个项目,将回滚数据库中的用户,但不会关闭帐户

因此,将在DB上回滚50个用户,但只关闭1个远程帐户


如何组织我的步骤以关闭50个远程帐户(如果此手动回滚失败,这不是一个一致性问题:尽最大努力)

关闭不需要的帐户的额外步骤如何?每个打开的帐户在其自己的事务中都存储在额外的表中(
opened\u account
),因此它不会被spring batch回滚。

清理步骤将沿着存储在
已开立账户中的数据运行,您可以在出错时重新启动,管理自定义重试操作等。

对不起,我不确定是否理解您的意思。我不明白当您在
开户账户
表中插入内容时,每次创建有效账户时,您都会将此信息存储在
开户账户
表中(使用单独的交易);保存区块时,您将删除同一事务中的
OPENED\u账户
内容:如果区块提交失败,您在清理步骤中有要删除的账户
OPENED\u账户
,但插入OPENED\u账户也可能失败。顺便说一句,在step ExecutionContext中存储当前打开的区块帐户不是更容易吗?