我有一个 Spring Boot 应用程序,我需要在其中安排一项作业以从特定目录读取文件并将数据存储到数据库中。
由于文件数量非常大,我使用 Spring Batch 来处理文件部分。
该应用程序有一个名为 的组件,PraserStarer该组件有一个名为 的方法startParsing。这个方法是用@scheduledannotation来注释的。
@scheduled(fixedDelay = 60 * 1000)
public startParsing(){
// start spring batch job
}
Run Code Online (Sandbox Code Playgroud)
我有一个存储库接口NewsRepositry注入到 Spring Batch 第一步的编写器中。
该应用程序有一个简单的控制器来手动调用该startParsing方法。从控制器调用 startParsing 方法时,一切正常。spring批处理作业正常启动,读取文件,将数据写入DB,并对文件进行归档。
当从调度框架调用该方法时startParsing,Spring Batch作业正常启动,并读取文件,但数据库中没有存储任何内容。
我怀疑这里的问题是有两种不同的上下文,一种用于调度部分,另一种用于应用程序的其余部分。
由于某种原因,调度上下文中没有事务管理器,这导致没有任何内容进入数据库。
1-我的怀疑正确吗?
2-如果是,我如何强制事务管理器加载到其他上下文?
解析器起始类的代码如下
@Component
public class ParserStarter {
@Autowired
JobLauncher jobLauncher;
@Value("${app.data_directory}")
private String dataDir;
@Autowired
private ParserJobListener jobListener;
@Autowired
private JobBuilderFactory jobBuilderFactory;
public Resource[] getResources() throws IOException {
// return array …Run Code Online (Sandbox Code Playgroud)