質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Spring Batch

Spring Batchは、バッチ処理向けに定義されたオープンソースのフレームワーク。エンタープライズシステムで避けて通れないバッチ処理を可能にします。設定ファイルに別定義することで効率よく開発することがで可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

1086閲覧

Spring BatchでListenerが動きません

begginerpg

総合スコア10

Spring Batch

Spring Batchは、バッチ処理向けに定義されたオープンソースのフレームワーク。エンタープライズシステムで避けて通れないバッチ処理を可能にします。設定ファイルに別定義することで効率よく開発することがで可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/03/16 14:33

前提・実現したいこと

最近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を追加する場所などで動作が変わるというのを他の質問版で見かけたので、
そのあたりを試行錯誤触ってみましたが状況変わらず…。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問