# Spring Batchで<br/>自動化 ###### tags: `発表資料` `AOSN` `メモ` aosn読書会@湯涌温泉  2017/09/16 Takumi Okamoto --- ## お前誰やねん Name : 岡本 拓海 - Tasktoys Robotics 代表 - (株)BridgeSolution 取締役 普段は機械設計をしたり、Webのサーバーサイド書いたりして糊口をしのいでます。 SNSとか - Twitter: [@MrBearin](https://twitter.com/MrBearing2) - Facebook: [takumi.okamoto](https://www.facebook.com/takumi.okamoto) --- ## Spring Batchとは何ぞや - 仕事で使ったのでちょっと紹介 - JavaのフレームワークSpringFrameworkの一部 - リスタートや失敗時の復帰なども簡単に書ける - 並列処理やWebインターフェース等、便利な機能が色々とある --- ## 概要 Job ![](https://i.imgur.com/0ebcxIZ.png) --- ## Stepの仕組み ![](https://i.imgur.com/mPIYK7Y.png) --- ## やってみよう - 普通にSpringApplicationを準備 - @EnableBatchConfigurationを付与したConfigurationクラスを準備 --- ## 基本設定 ```Java @Configuration @EnableBatchProcessing public class BatchConfiguration { @Bean // <-各ジョブはBeanとして定義 public Job test(){ // startから順番に実行される return jobBuilderFactory.get("test") .start(testStep()) .next(testChunkStep()) .next(lambdaStep()) .build(); } } ``` 基本はこのクラスの中に設定を書いてく --- ## SpringBatchの基本構造 Job &sup; Step &sup; Tasklet or chunk --- ## 処理はどうやって書く? - Taskletを実装する - task同士の値のやり取りがない場合 - Reader/Writerを利用する <-こっちが多いかも - task同士で値をやり取りする場合 --- ## Taskletを実装する場合 ```Java @Bean // 単一のタスクレットを読み込むステップ public Step testStep(){ return stepBuilderFactory.get("test step ") .tasklet(lambdaStep()).build(); } @Bean // Taskletはラムダ式で記述することも可能 public Step lambdaStep(){ LOGGER.info("lamda"); return stepBuilderFactory.get("lambda step").tasklet( (stepContribution ,chunkContex ) -> RepeatStatus.FINISHED ).build(); } ``` --- ## 値のやり取りがある場合 1. Chunkを作る(BatchConfiguration.javaで) 2. Reader / Processor / Writer を実装 --- ## Stepの設定 BatchConfiguration.javaで設定 ```Java :BatchConfiguration.java //Reader -> Processor -> Writerを設定するステップ @Bean public Step testChunkStep(){ return stepBuilderFactory.get("chunk step") .<String,String>chunk(5) .reader(sampleReader) .processor(sampleProcessor) //<-何個も書ける .writer(sampleWriter) // <- 基本一個だけ .build(); } ``` --- ## Reader DBから読込み等のデータ生成タスク ```Java @Component public class SampleReader implements ItemReader<String>{ int cnt = 0; @Override public String read() throws UnexpectedInputException, ParseException, NonTransientResourceException { if(cnt > 100) return null; //<-nullを返すと次のデータが存在しない意味になる cnt++; StringBuilder builder = new StringBuilder("No."+cnt+"//"); builder.append(ZonedDateTime.now() .format(DateTimeFormatter.ISO_INSTANT)); return builder.toString(); } } ``` --- ## Processor バッチ処理難関の本体になるクラスクラスを受け取って他のクラスへ変換 ```Java @Component public class SampleProcessor implements ItemProcessor<String, String>{ @Override public String process(String item) throws Exception { return new StringBuilder("****") .append(item) //.append("["+"test"+ "]") .append("*****").toString(); } } ``` --- ## Writer 最終的な書き出し処理 ```Java @Component public class SampleWriter implements ItemWriter<String> { private static final Logger LOGGER = Logger.getLogger(SampleWriter.class); @Override public void write(List<? extends String> items) throws Exception { // 注意:Writer はListを受け取って処理 items.forEach(LOGGER::info); } } ``` --- ## DEMO ソースは[ココ](https://github.com/MrBearing/SpringBatchSample)を参照 --- ## その他 - Restを作ってAPI化できる - マルチスレッド化も可能 使いどころは限られると思うけど、みんな使ってみてね! --- # the End ---
{"metaMigratedAt":"2023-06-14T14:15:47.830Z","metaMigratedFrom":"YAML","title":"Spring Batchで<br/>自動化","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"dir\":\"ltr:ture\"}","contributors":"[{\"id\":\"610cfd52-ad2b-46e8-81e2-a79a85a7f06f\",\"add\":31,\"del\":0}]"}
    2053 views