前提・実現したいこと
最近Spring Batchを初めてみたのですが、初歩的なところで大きく躓いてしまいました…。
何分DIもちゃんと理解できないまま試している状態なので、すごく恥ずかしいミスがあるかもしれません…。
ご教示宜しくお願い致します。
環境:
・Eclipse (Pleiades)
使用したフレームワーク・ライブラリなど:
・Spring Boot (STS 3.9.13)
・MyBatis
処理:
MyBatisを使用してDBからユーザー情報を取得し、ファイルに書き出す単純なもの
発生している問題・エラーメッセージ
①readerは成功している様子なのにwriterがスキップされてしまう ※②が解決すれば調査可能…?
コンソールログは以下が出力
StepExecution: id=1, version=3, name=idStepUserFileOut, status=COMPLETED, exitStatus=COMPLETED, readCount=8, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=8, processSkipCount=0, commitCount=1, rollbackCount=9, exitDescription=
②原因を調べるためにListenerを仕込んでみたものの、上手く動作しません。
⇒デバッガでも止まらず、System.out.println()で何も出力されません。
⇒JobExecutionListenerだけは効いてくれますが、その他のstepレベルのListenerはすべて動作してないようです。
該当のソースコード
JobConfig
Java
1@Configuration 2@RequiredArgsConstructor 3public class UserFileOutJobConfig { 4 private final JobBuilderFactory jobBuilderFactory; 5 private final StepBuilderFactory stepBuilderFactory; 6 private final UserProcessor userProcessor; 7 private final SqlSessionFactory sqlSessionFactory; 8 9 @Bean 10 public Job UserFileOutJob(@Qualifier("userFileOutStep") Step userFileOutStep ) { 11 12 // ジョブを作成して返す 13 return jobBuilderFactory.get("idJobUserFileOut") 14 .start(userFileOutStep) 15 .listener(new ComJobListener()) 16 .build(); 17 } 18 19 @Bean("userFileOutStep") 20 public Step userFileOutStep(MyBatisCursorItemReader<UserSLEntity> userListDBReader, 21 FlatFileItemWriter<UserSLEntity> userListFileWriter, 22 CustomSkipListener customSkipListener) { 23 24 Logger logger = LoggerFactory.getLogger(UserFileOutJobConfig.class); 25 26 // ステップを作成して返す 27 return stepBuilderFactory.get("idStepUserFileOut") 28 .<UserSLEntity, UserSLEntity>chunk(1) 29 // < Step1 Reader > 30 .reader(userListDBReader) 31 .listener(new UserReadListener(logger)) 32 // < Step2 Processor > 33 .processor(userProcessor) 34 // < Step3 Writer > 35 .writer(userListFileWriter) 36 // リスナーの設定 37 .listener(new ComWriteListener(logger)) 38 .listener(customSkipListener) 39 .listener(new ComStepListener()) 40 // 完成 41 .build(); 42 } 43 44 @Bean 45 public MyBatisCursorItemReader<UserSLEntity> userListDBReader() { 46 47 Map<String, Object> sqlParam = new HashMap<>(); 48 sqlParam.put("searchWord", ComUtil.convSqlLike("")); 49 50 return new MyBatisCursorItemReaderBuilder<UserSLEntity>() 51 .sqlSessionFactory(sqlSessionFactory) 52 .queryId("user.batch.User.selectList") 53 .parameterValues(sqlParam) 54 .build(); 55 } 56 57 @Bean 58 public FlatFileItemWriter<UserSLEntity> userListFileWriter() { 59 60 FileSystemResource fsr = new FileSystemResource("/D:/test/userList.csv"); 61 62 return new FlatFileItemWriterBuilder<UserSLEntity>() 63 .name("userListFile-writer") 64 .resource(fsr) 65 .lineAggregator((UserSLEntity item) -> { 66 StringBuilder sb = new StringBuilder(); 67 sb.append(item.getUserId()); 68 sb.append(item.getUserName()); 69 sb.append(item.getMailAddress()); 70 return sb.toString(); 71 }) 72 .build(); 73 } 74}
テストクラス
Java
1@SpringBootTest 2class UserFileOutTests { 3 @Autowired 4 private JobRegistry jobRegistry; 5 @Autowired 6 private JobLauncher jobLauncher; 7 8 @Test 9 void test1() { 10 String jobName = "idJobUserFileOut"; 11 JobParameters jobParameters = new JobParametersBuilder() 12 .toJobParameters(); 13 14 try { 15 Job job = jobRegistry.getJob(jobName); 16 JobExecution jobExecution = jobLauncher.run(job, jobParameters); 17 18 assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); 19 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 } 24}
Listenerの例
Java
1@RequiredArgsConstructor 2public class UserReadListener implements ItemReadListener<UserSLEntity> { 3 private final Logger logger; 4 5 @Override 6 public void beforeRead() { 7 System.out.println("beforeRead!"); 8 } 9 10 @Override 11 public void afterRead(UserSLEntity item) { 12 System.out.println("afterRead!"); 13 } 14 15 @Override 16 public void onReadError(Exception ex) { 17 logger.error(ex.getMessage()); 18 } 19}
試したこと
Listenerを追加する場所などで動作が変わるというのを他の質問版で見かけたので、
そのあたりを試行錯誤触ってみましたが状況変わらず…。
あなたの回答
tips
プレビュー