如何管理春季批处理内部较短的交易



我使用春季批处理有问题,似乎找不到解决方案。

所以,我有一个批量处理的一些项目(尺寸10)。我还使用此批次使用了一位交易管理器来持续处理后的项目。

但是...我也想实时持续一些这些项目的进度状态。因此,在处理项目之前,我想保存一个状态,说此项目正在进行中。

我似乎找不到解决方案。我尝试了以下解决方案:

  1. 如果我只是用交易注释我的状态管理器服务,则在整个块处理后进行状态。
  2. 如果我添加需要作为注释的传播级别,则有效...但是批次以某种僵局结束(我读到需要 regience_new )。
  3. 所以我最后的猜测是添加第二个交易管理器(在同一数据源上)并在状态管理器服务上使用它...但是我得到的结果与解决方案#1相同(对我来说似乎是我预期的从该经理到独立于块交易的交易)。

有人遇到这个问题吗?

编辑:这是我的配置,是故意简化的:

类dbconfiguration:

@Configuration
public class DbConfiguration {
    @Bean
    @Primary
    public JpaTransactionManager transactionManager() throws Exception {
        final JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory());
        jpaTransactionManager.afterPropertiesSet();
        return jpaTransactionManager;
    }
}

班级作业:

@Configuration
@Import(DbConfiguration.class)
@EnableTransactionManagement
public class JobConfiguration {
    @Autowired
    private EntityManagerFactory entityManagerFactory;
    @Bean
    public Job jobDefinition() {
        return jobBuilderFactory
            .get(JOB_NAME)
            .start(step())
            .build();
    }
    @Bean
    public Step step() {
        return stepBuilderFactory
            .get(STEP_NAME)
            .<Object, Object>chunk(COMMIT_INTERVAL)
                    .reader(reader())
                    .processor(processor())
                    .writer(writer())
            .build();
    }
    @Bean
    public PlatformTransactionManager statusTransactionManager() {
        final JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
        jpaTransactionManager.afterPropertiesSet();
        return jpaTransactionManager;
    }
}

类SedutmanagerServiceImpl:

@Transactional("statusTransactionManager")
public class StatusManagerServiceImpl implements StatusManagerService {
    ...
}

实现此目的的一种方法是使用Spring TransactionTemplate如下:

@Service
public class StatusManagerServiceImpl implements StatusManagerService {
    @Autowired
    private PlatformTransactionManager transactionManager;
    public separateTransactionMethod() {
        TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                // Do something here that will be committed right away.
            }
        });
    }
}

如果您有结果返回,则可以使用新的TransactionCallback。然后执行方法将返回结果。

最新更新