我使用春季批处理有问题,似乎找不到解决方案。
所以,我有一个批量处理的一些项目(尺寸10)。我还使用此批次使用了一位交易管理器来持续处理后的项目。
但是...我也想实时持续一些这些项目的进度状态。因此,在处理项目之前,我想保存一个状态,说此项目正在进行中。
我似乎找不到解决方案。我尝试了以下解决方案:
- 如果我只是用交易注释我的状态管理器服务,则在整个块处理后进行状态。
- 如果我添加需要作为注释的传播级别,则有效...但是批次以某种僵局结束(我读到需要 regience_new )。
- 所以我最后的猜测是添加第二个交易管理器(在同一数据源上)并在状态管理器服务上使用它...但是我得到的结果与解决方案#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。然后执行方法将返回结果。