発表資料
AOSN
メモ
aosn読書会@湯涌温泉
2017/09/16
Takumi Okamoto
Name : 岡本 拓海
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean // <-各ジョブはBeanとして定義
public Job test(){
// startから順番に実行される
return jobBuilderFactory.get("test")
.start(testStep())
.next(testChunkStep())
.next(lambdaStep())
.build();
}
}
基本はこのクラスの中に設定を書いてく
Job ⊃ Step ⊃ Tasklet or chunk
@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();
}
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();
}
DBから読込み等のデータ生成タスク
@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();
}
}
バッチ処理難関の本体になるクラスクラスを受け取って他のクラスへ変換
@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();
}
}
最終的な書き出し処理
@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);
}
}
ソースはココを参照
使いどころは限られると思うけど、みんな使ってみてね!
# the End