8IBU`TOFXJO
4QSJOH#BUDI
+46(4QSJOH'FTU
+46(ελοϑɹ஑୩ɹஐߦ
ࣗ‫঺ݾ‬հ
w೔ຊ4QSJOHϢʔβձ +46( ελοϑ
w๭4*FSͰιϑτ΢ΣΞΞʔΩςΫτ
ʢ࣮ଶ͸؅ཧ‫ۀ‬຿ଟΊɾɾɾʣ
w๭ॻͷචऀͷҰਓ
IUUQTXXXTIPFJTIBDPKQCPPLEFUBJM
2
4QSJOH#BUDIͷա‫ڈ‬ͷษ‫ڧ‬ձ
3
https://www.slideshare.net/apkiban/ss-122881217
+46(ษ‫ڧ‬ձˏ
ࠓճɿ4QSJOH#BUDIͷ͓͞Β͍ʴ4QSJOH#BUDIͷ৽‫ػ‬ೳͳͲ
+46(ษ‫ڧ‬ձˏ
https://www.slideshare.net/ikeyat/spring-batch-tips-233698138 https://www.slideshare.net/nttdata-tech/spring-fest-
2020-spring-batch-nttdata
4QSJOH'FTU!
https://www.slideshare.net/HideyukiSASAKURA/batch-spring-batch
ΞδΣϯμ
w4QSJOH#BUDIͱ͸ʁ
w5BTLMFUWT$IVOL
w4QSJOH#BUDI
w4QSJOH#BUDI͔Βͷมߋ
w৽‫ػ‬ೳ
4
ΞδΣϯμ
w4QSJOH#BUDIͱ͸ʁ
w5BTLMFUWT$IVOL
w4QSJOH#BUDI
w4QSJOH#BUDI͔Βͷมߋ
w৽‫ػ‬ೳ
5
όονॲཧͱ͸ʁ
6
Ұൠతʹɺόονॲཧͱ͸ʮ·ͱΊͯҰ‫ॲׅ‬ཧ͢Δʯ͜ͱΛࢦ͢ɻ
IUUQTUFSBTPMVOBCBUDIHJUIVCJPHVJEFMJOFDVSSFOUKBTJOHMF@JOEFYIUNM$I@(FOFSBM#BUDI1SPDFTT
όονॲཧΛ࠾༻͢Δ໨త
wεϧʔϓοτͷ޲্
wʢΦϯϥΠϯॲཧͷʣԠ౴ੑͷ֬อ
w࣌ؒ΍Πϕϯτ΁ͷରԠ
w֎෦γεςϜͱͷ࿈‫্ܞ‬ͷ੍໿
‫ٻ‬ΊΒΕΔཁ݅
wੑೳ޲্
wҟৗൃੜ࣌ͷϦΧόϦ
wଟ༷ͳ‫ى‬ಈํࣜ
w͞·͟·ͳೖग़ྗΠϯλϑΣʔε
όονॲཧͱ͸ʁ
7
Ұൠతʹɺόονॲཧͱ͸ʮ·ͱΊͯҰ‫ॲׅ‬ཧ͢Δʯ͜ͱΛࢦ͢ɻ
IUUQTUFSBTPMVOBCBUDIHJUIVCJPHVJEFMJOFDVSSFOUKBTJOHMF@JOEFYIUNM$I@(FOFSBM#BUDI1SPDFTT
όονॲཧΛ࠾༻͢Δ໨త
wεϧʔϓοτͷ޲্
wʢΦϯϥΠϯॲཧͷʣԠ౴ੑͷ֬อ
w࣌ؒ΍Πϕϯτ΁ͷରԠ
w֎෦γεςϜͱͷ࿈‫্ܞ‬ͷ੍໿
‫ٻ‬ΊΒΕΔཁ݅
wੑೳ޲্
wҟৗൃੜ࣌ͷϦΧόϦ
wଟ༷ͳ‫ى‬ಈํࣜ
w͞·͟·ͳೖग़ྗΠϯλϑΣʔε
4QSJOH#BUDI
͕αϙʔτ
4QSJOH#BUDIͱ͸ʁ
8
4QSJOHϑϨʔϜϫʔΫΛϕʔεͱͨ͠ɺ
όονॲཧ޲͚+BWBΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
IUUQTTQSJOHJPCBUDI
4QSJOH#BUDIͱ͸ʁ
9
w ॲཧͷྲྀΕΛఆ‫ܕ‬Խ͢Δ‫ػ‬ೳʢλεΫϨοτɺνϟϯΫʣ
w ༷ʑͳ‫ى‬ಈํ๏ʢίϚϯυϥΠϯɺ4FSWMFU౳ʣ
w ༷ʑͳσʔλ‫ࣜܗ‬ͷೖग़ྗʢϑΝΠϧɺ%#ɺΩϡʔɺ౳ʣ
w ॲཧͷޮ཰Խʢଟॏ࣮ߦɺฒྻ࣮ߦɺ৚݅෼‫ذ‬ɺ౳ʣ
w δϣϒͷ؅ཧʢ࣮ߦঢ়‫گ‬ͷӬଓԽɺϦελʔτɺ౳ʣ
IUUQTUFSBTPMVOBCBUDIHJUIVCJPHVJEFMJOFDVSSFOUKBTJOHMF@JOEFYIUNM$I@4QSJOH#BUDISDI@0WFSWJFX
ఏ‫͞ڙ‬ΕΔ୅දతͳ‫ػ‬ೳ
4QSJOH#BUDIͷ‫ج‬ຊߏ੒
10
4QSJOH#BUDI
+PC-BVODIFS +PC
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO
fi
HVSF+PC
+PC3FQPTJUPSZ
+PC
+PC
4UFQ
4UFQ
4UFQ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
ॲཧͷྲྀΕ
؅ཧσʔλͷྲྀΕ
4QSJOH#BUDIͷ‫ج‬ຊߏ੒
11
4QSJOH#BUDI
+PC-BVODIFS +PC
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO
fi
HVSF+PC
+PC3FQPTJUPSZ
+PC
+PC
4UFQ
4UFQ
4UFQ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
ॲཧͷྲྀΕ
؅ཧσʔλͷྲྀΕ
+PC-BVODIFS
+PCΛ‫ى‬ಈ͢ΔΠϯλʔϑΣΠεɻྫ
͑͹ɺίϚϯυϥΠϯ͔Βͷ‫ى‬ಈ࣌
ʹ+PCΛ‫ى‬ಈ͢ΔͨΊʹ‫ݺ‬͹ΕΔɻ
+PC
όονॲཧͷҰ࿈Λ·ͱΊ࣮ͨ
ߦ୯Ґɻ࣮ࡍͷॲཧ͸4UFQʹ෼ׂ
࣮ͯ͠૷͠‫ͼݺ‬ग़͢ɻ
4QSJOH#BUDIͷ‫ج‬ຊߏ੒
12
4QSJOH#BUDI
+PC-BVODIFS +PC
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO
fi
HVSF+PC
+PC3FQPTJUPSZ
+PC
+PC
4UFQ
4UFQ
4UFQ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
ॲཧͷྲྀΕ
؅ཧσʔλͷྲྀΕ
4UFQ
ॲཧͷ࣮૷΍࣮ߦ؅ཧΛߦ͏࠷খ୯Ґɻͭͷ+PCΛෳ਺ͷ4UFQʹ෼ׂͯ͠
ॲཧ͢Δ͜ͱʹΑΓɺॲཧͷ࠶ར༻ɺฒྻԽɺ৚݅෼‫͕ذ‬ՄೳʹͳΔɻ
νϟϯΫϞσϧ·ͨ͸λεΫϨοτϞσϧͷ͍ͣΕ͔Ͱ࣮૷͢Δɻ
4QSJOH#BUDIͷ‫ج‬ຊߏ੒
13
4QSJOH#BUDI
+PC-BVODIFS +PC
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO
fi
HVSF+PC
+PC3FQPTJUPSZ
+PC
+PC
4UFQ
4UFQ
4UFQ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
ॲཧͷྲྀΕ
؅ཧσʔλͷྲྀΕ
*UFN3FBEFS*UFN1SPDFTTPS*UFN8SJUFS
νϟϯΫϞσϧΛ࣮૷͢ΔࡍʹɺσʔλͷೖྗՃ޻ग़ྗͷͭʹ෼ׂ͢Δ
ͨΊͷΠϯλϑΣʔεɻࣗલͰ࣮૷͢Δ͔ɺ4QSJOH#BUDI͕ఏ‫͢ڙ‬Δ࣮૷
ʢ%#ɺϑΝΠϧͷೖग़ྗॲཧͳͲʣΛར༻͢Δɻ
4QSJOH#BUDIͷ‫ج‬ຊߏ੒
14
4QSJOH#BUDI
+PC-BVODIFS +PC
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO
fi
HVSF+PC
+PC3FQPTJUPSZ
+PC
+PC
4UFQ
4UFQ
4UFQ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
ॲཧͷྲྀΕ
؅ཧσʔλͷྲྀΕ
+PC3FQPTJUPSZ
+PC΍4UFQͷ࣮ߦঢ়ଶɺ݁ՌΛ֎෦%#Ͱ؅ཧ͢ΔͨΊͷΠϯλʔϑΣΠε
‫ۀ‬຿ϩδοΫͱ͸ผτϥϯβΫγϣϯͰ%#ΞΫηεɻ
ʢӬଓԽͨ͘͠ͳ͍৔߹͸ɺ)౳ͷΠϯϝϞϦ%#ʹ֨ೲͤ͞‫ͤ͞ൃش‬Δʣ
ࢀߟɿ+PC3FQPTJUPSZͷςʔϒϧߏ଄
15
https://terasoluna-batch.github.io/guideline/current/ja/single_index.html#Ch02_SpringBatchArch_Arch_MetadataSchema
+PCʢ+PC໊º+PCҾ਺ͷ୯ҐͰ
૿Ճʣ
+PCͷঢ়ଶɾ࣮ߦ݁Ռ
ʢ+PC࣮ߦͷ౓ʹ૿Ճʣ
+PC಺ͷ4UFQͷঢ়ଶɾ࣮ߦ݁Ռ
ʢ4UFQ࣮ߦͷ౓ʹ૿Ճʣ
4UFQίϯςΩετΦϒδΣΫτͷ
γϦΞϥΠζσʔλ
+PCίϯςΩετΦϒδΣΫτ
ͷγϦΞϥΠζσʔλ
+PCҾ਺
)FMMP8PSME
16
4QSJOH#BUDI
)%BUBCBTF
Λ%FQFOEFODZʹ௥Ճ
IUUQTTUBSUTQSJOHJP
޷ΈͰ.BWFO
4UFQɿ4QSJOH*OJUJBMJ[SͰ4QSJOH#BUDIϓϩδΣΫτΛੜ੒
˞4QSJOH#PPUར༻લఏ
)FMMP8PSME
17
dependencies


dependency


groupIdorg.springframework.boot/groupId


artifactIdspring-boot-starter-batch/artifactId


/dependency


dependency


groupIdcom.h2database/groupId


artifactIdh2/artifactId


scoperuntime/scope


/dependency


...
4UFQɿ4QSJOH#BUDIͷTUBSUFS͕ద༻͞Ε͍ͯΔ͜ͱΛ֬ೝ
˞4QSJOH#PPUར༻લఏ
)FMMP8PSME
18
@Bea
n

@StepScop
e

public Tasklet demoTakslet()
{

return new Tasklet()
{

@Overrid
e

public RepeatStatus execute(StepContribution stepContribution
,

ChunkContext chunkContext) throws Exception
{

StepExecution stepExecution = stepContribution.getStepExecution()
;

JobParameters jobParameters = stepExecution.getJobParameters()
;

String firstName = jobParameters.getString(firstName)
;

String lastName = jobParameters.getString(lastName)
;

log.info(Hello World, {} {}, lastName, firstName)
;

return RepeatStatus.FINISHED
;

}

}
;

}

4UFQɿδϣϒύϥϝʔλʢίϚϯυҾ਺ʣΛϩάʹग़ྗ͢ΔλεΫϨοτΛ࣮૷
˞4QSJOH#PPUར༻લఏ
)FMMP8PSME
19
@Bea
n

@StepScop
e

public Tasklet demoTakslet()
{

return new Tasklet()
{

@Overrid
e

public RepeatStatus execute(StepContribution stepContribution
,

ChunkContext chunkContext) throws Exception
{

StepExecution stepExecution = stepContribution.getStepExecution()
;

JobParameters jobParameters = stepExecution.getJobParameters()
;

String firstName = jobParameters.getString(firstName)
;

String lastName = jobParameters.getString(lastName)
;

log.info(Hello World, {} {}, lastName, firstName)
;

return RepeatStatus.FINISHED
;

}

}
;

}

4UFQɿδϣϒύϥϝʔλʢίϚϯυҾ਺ʣΛϩάʹग़ྗ͢ΔλεΫϨοτΛ࣮૷
˞4QSJOH#PPUར༻લఏ
5BTLMFUΠϯλʔϑΣΠεΛ࣮૷͠#FBOొ࿥
)FMMP8PSME
20
@Bea
n

@StepScop
e

public Tasklet demoTakslet()
{

return new Tasklet()
{

@Overrid
e

public RepeatStatus execute(StepContribution stepContribution
,

ChunkContext chunkContext) throws Exception
{

StepExecution stepExecution = stepContribution.getStepExecution()
;

JobParameters jobParameters = stepExecution.getJobParameters()
;

String firstName = jobParameters.getString(firstName)
;

String lastName = jobParameters.getString(lastName)
;

log.info(Hello World, {} {}, lastName, firstName)
;

return RepeatStatus.FINISHED
;

}

}
;

}

4UFQɿδϣϒύϥϝʔλʢίϚϯυҾ਺ʣΛϩάʹग़ྗ͢ΔλεΫϨοτΛ࣮૷
˞4QSJOH#PPUར༻લఏ
δϣϒύϥϝʔλ
Λऔಘ
ϩάʹδϣϒύϥϝʔλΛग़ྗ
)FMMP8PSME
21
@Bea
n

public Step demoStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager, Tasklet tasklet)
{

return new StepBuilder(demoStepTasklet, jobRepository
)

.tasklet(tasklet, transactionManager
)

.build()
;

}

4UFQɿ4UFQΛ࡞੒ɾొ࿥͠ɺ4UFQͷλεΫϨοτΛઃఆ͢Δ
˞4QSJOH#PPUར༻લఏ
લड़5BTLMFUΛ‫ͼݺ‬ग़͢4UFQΛ࡞੒
)FMMP8PSME
22
@Bea
n

public Job demoJob(JobRepository jobRepository, Step step)
{

return new JobBuilder(demoJob, jobRepository
)

.start(step
)

.build()
;

}

4UFQɿ+PCΛ࡞੒ɾొ࿥͠ɺ4UFQͷ4UFQΛઃఆ͢Δ
˞4QSJOH#PPUར༻લఏ
લड़4UFQΛ‫ͼݺ‬ग़͢+PCΛ࡞੒
)FMMP8PSME
23
$ mvn package
...
$ java -jar target/demo-batch-v5-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/ / ___'_ __ _ _(_)_ __ __ _    
( ( )___ | '_ | '_| | '_ / _` |    
/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.4)
...
2023-03-11T02:08:47.138+09:00 INFO 63289 --- [ main]
c.e.demobatchv5.DemoBatchV5Application : Hello World, null null
...
4UFQɿΞϓϦέʔγϣϯΛ࣮ߦ͢ΔʢίϚϯυҾ਺ͳ͠ʣ
˞4QSJOH#PPUར༻લఏ
ϩά͸ग़͕ͨɺδϣϒύϥϝʔλʢίϚϯυҾ
਺ʣະࢦఆͷͨΊOVMM
)FMMP8PSME
24
$ mvn package
...
$ java -jar target/demo-batch-v5-0.0.1-SNAPSHOT.jar firstName=TARO
lastName=SATO
. ____ _ __ _ _
/ / ___'_ __ _ _(_)_ __ __ _    
( ( )___ | '_ | '_| | '_ / _` |    
/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.4)
...
2023-03-11T02:11:51.087+09:00 INFO 63302 --- [ main]
c.e.demobatchv5.DemoBatchV5Application : Hello World, SATO TARO
...
4UFQɿΞϓϦέʔγϣϯΛ࣮ߦ͢ΔʢίϚϯυҾ਺͋Γʣ
˞4QSJOH#PPUར༻લఏ
δϣϒύϥϝʔλ͕ਖ਼͘͠දࣔ͞Εͨ
ΞδΣϯμ
w4QSJOH#BUDIͱ͸ʁ
w5BTLMFUWT$IVOL
w4QSJOH#BUDI
w4QSJOH#BUDI͔Βͷมߋ
w৽‫ػ‬ೳ
25
5BTLMFUͱ͸ʁ$IVOLͱ͸ʁ
26
5BTLMFUϞσϧ
‫ۀ‬຿ϩδοΫ
$IVOLϞσϧ
‫ۀ‬຿ϩδοΫ
ࣗ༝ʹίʔυΛ૊Ή
ϧʔϓ੍‫ޚ‬
ʢνϟϯΫ
୯Ґʣ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
ઃఆ֦ு
ઃఆ֦ு
ઃఆ֦ு
ͬ͘͟Γͷҧ͍
@Bea
n

@StepScop
e

public Tasklet demoTakslet()
{

return new Tasklet()
{

@Overrid
e

public RepeatStatus execute(StepContribution stepContribution
,

ChunkContext chunkContext) throws Exception
{

// ϏδωεϩδοΫΛ࣮૷
return RepeatStatus.FINISHED
;

}

}
;

}

@Bea
n

public Step demoStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager, Tasklet tasklet)
{

return new StepBuilder(demoStepTasklet, jobRepository
)

.tasklet(tasklet, transactionManager
)

.build()
;

}

5BTLMFUʢλεΫϨοτʣϞσϧͷ࣮૷ྫ
27
5BTLMFUΠϯλʔϑΣΠεΛ࣮૷͠#FBOొ࿥
5BTLMFU#FBOΛ4UFQʹొ࿥
$IVOLʢνϟϯΫʣϞσϧͷ࣮૷ྫ 
28
@Bea
n

@StepScop
e

public FlatFileItemReader fileItemReader
(

@Value(#{jobParameters['inputFile']}) String filePath) {
// தུ
FlatFileItemReaderInputHoge fileItemReade
r

= new FlatFileItemReader()
;

fileItemReader.setResource(new FileSystemResource(filePath))
;

fileItemReader.setLineMapper(lineMapper)
;

return fileItemReader
;

}

@Bea
n

@StepScop
e

public ItemProcessor itemProcessor()
{

return new ItemProcessorInputHoge, OutputFuga()
{

@Overrid
e

public OutputFuga process(InputHoge inputHoge
)

throws Exception
{

// தུ(ೖྗInputHogeग़ྗOutputFugaͷม‫׵‬ϩδοΫ
)

return outputFuga
;

}

}
;

}
ᶃ*UFN3FBEFSͷ#FBOఆٛ
ʢྫͰ͸$47ϑΝΠϧೖྗʣ
ᶄ*UFN1SPDFTTPSͷ#FBOఆٛ
4QSJOH#BUDIఏ‫ڙ‬Ϋϥεʹઃఆద༻
$IVOLʢνϟϯΫʣϞσϧͷ࣮૷ྫ 
29
@Bea
n

@StepScop
e

public FlatFileItemReader fileItemReader
(

@Value(#{jobParameters['inputFile']}) String filePath) {
// தུ
FlatFileItemReaderInputHoge fileItemReade
r

= new FlatFileItemReader()
;

fileItemReader.setResource(new FileSystemResource(filePath))
;

fileItemReader.setLineMapper(lineMapper)
;

return fileItemReader
;

}

@Bea
n

@StepScop
e

public ItemProcessor itemProcessor()
{

return new ItemProcessorInputHoge, OutputFuga()
{

@Overrid
e

public OutputFuga process(InputHoge inputHoge
)

throws Exception
{

// தུ(ೖྗInputHogeग़ྗOutputFugaͷม‫׵‬ϩδοΫ
)

return outputFuga
;

}

}
;

}
Ճ޻લʢ*UFN3FBEFS͔ΒͷJOQVUʣ
Ճ޻‫ޙ‬ʢ*UFN8SJUFS΁ͷPVUQVUʣ
Ճ޻લʢ*UFN1SPDFTTPS΁
ͷPVUQVUʣ
@Bea
n

@StepScop
e

public FlatFileItemWriter fileItemWriter
(

@Value(#{jobParameters['outputFile']}) String filePath)
{

// தུ
FlatFileItemWriterOutputFuga fileItemWrite
r

= new FlatFileItemWriter()
;

fileItemWriter.setResource(new FileSystemResource(filePath))
;

fileItemWriter.setLineAggregator(aggregator)
;

return fileItemWriter
;

}
$IVOLʢνϟϯΫʣϞσϧͷ࣮૷ྫ 
30
@Bea
n

public Step demoStepChunk(JobRepository jobRepository, PlatformTransactionManager
transactionManager, ItemReaderInputHoge reader, ItemProcessorInputHoge,
OutputFuga processor, ItemWriterOutputFuga writer)
{

return new StepBuilder(demoChunk, jobRepository
)

.InputHoge, OutputFugachunk(10, transactionManager
)

.reader(reader
)

.processor(processor
)

.writer(writer
)

.build()
;

}
ᶅ8SJUFSͷ#FBOఆٛ
ʢྫͰ͸$47ϑΝΠϧग़ྗʣ
ᶆ*UFN3FBEFS*UFN1SPDFTTPS*UFN8SJUFS
֤#FBOΛ4UFQʹొ࿥
νϟϯΫαΠζ
ઃఆ
4QSJOH#BUDIఏ‫ڙ‬Ϋϥεʹઃఆద༻
ࢀߟɿ୅දతͳ3FBEFS1SPDFTTPS8SJUFS
31
*UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS
ϑΝΠϧ
FlatFileItemReader
StaxEventItemReader
JsonFileItemReader
 FlatFileItemWriter
StaxEventItemWriter
JsonFileItemWriter
%#
JdbcCursorItemReader
JdbcPagingItemReader
MyBatisCursorItemReader
MyBatisPagingItemReader
JpaPagingItemReader
HibernateCursorItemReader
HibernatePagingItemReader
 JdbcBatchItemWriter
MyBatisBatchItemWriter
JpaItemWriter
HibernateItemWriter
ͦͷଞ
MongoItemReader
JmsItemReader
AmqpItemReader
PassThroughItemProcessor
ValidatingItemProcessor
CompositeItemProcessor
JmsItemWriter
AmqpItemWriter
ࢀߟɿ5BTLMFUͱ$IVOLͷؔ܎
32
4QSJOH#BUDIશମ૾
https://terasoluna-batch.github.io/guideline/current/ja/single_index.html#Ch02_SpringBatchArch_Arch_BusinessLogic
ࢀߟɿ5BTLMFUͱ$IVOLͷؔ܎
33
4QSJOH#BUDIશମ૾
https://terasoluna-batch.github.io/guideline/current/ja/single_index.html#Ch02_SpringBatchArch_Arch_BusinessLogic
͍ΘΏΔ5BTLMFU
͍ΘΏΔ$IVOL
ಛ௃
34
‫఺؍‬ 5BTLMFUϞσϧ $IVOLϞσϧ ߟ࡯
‫ۀ‬຿ϩδοΫ
‫ه‬ड़ͷࣗ༝౓
ࣗ༝౓ߴ͍
ʢϩδοΫશͯΛ։ൃऀ
͕‫ه‬ड़ʣ
ࣗ༝౓௿͍
ʢ3FBEFSɺ1SPDFTTPSɺ
8SJUFSͷ૊Έ߹Θͤʣ
$IVOL͸ઃ‫ߏͰ఺࣌ܭ‬଄
ҙ͕ࣝඞཁͰɺ5BTLMFUΑ
Γ΋ֶशίετߴ͍ɻ
τϥϯβΫγ
ϣϯ
̍τϥϯβΫγϣϯ
݅਺ʗνϟϯΫαΠζ
ʹ෼ׂ
ϦϥϯͰϦΧόϦ͍ͨ͠
৔߹͸5BTLMFUɺ
ϦελʔτͰϦΧόϦ΍
େྔσʔλॲཧʹ͸
$IVOLɻ
Ϧελʔτ ະରԠ ରԠ
https://terasoluna-batch.github.io/guideline/current/ja/single_index.html#Ch03_ChunkOrTasklet
ΞδΣϯμ
w4QSJOH#BUDIͱ͸ʁ
w5BTLMFUWT$IVOL
w4QSJOH#BUDI
w4QSJOH#BUDI͔Βͷมߋ
w৽‫ػ‬ೳʢωΠςΟϒαϙʔτɺ
0CTFSWBCJMJUZʣ
35
4QSJOH#BUDI
36
w 4QSJOHੈ୅ͷ4QSJOH#BUDI
w 4QSJOHͷ(SBBM7.ωΠςΟϒϏϧυ΍0CTFSWBCJMJUZʹ௥ै
w 4QSJOH#BUDI͔Βͷඇ‫׵ޓ‬ੑ͸গ͋͠Γ
4QSJOH
4QSJOH#BUDI
4QSJOH#PPU
4QSJOH
4QSJOH#BUDI
4QSJOH#PPU
+BWB ʙ PS ʙ
+BWB
+BLBSUB
ʙ
5PNDBU +FUUZ
ʙ
5PNDBU +FUUZ
)JCFSOBUF
4QSJOH#BUDIͷαϙʔτ‫ؒظ‬
37 IUUQTTQSJOHJPQSPKFDUTTQSJOHCBUDITVQQPSU
ΞδΣϯμ
w4QSJOH#BUDIͱ͸ʁ
w5BTLMFUWT$IVOL
w4QSJOH#BUDI
w4QSJOH#BUDI͔Βͷมߋ
w৽‫ػ‬ೳ
38
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
39
39
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
40
40
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
41
41
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
+PC3FQPTJUPSZ༻ͷτϥϯβΫ
γϣϯϚωʔδϟ͕ΞϓϦέʔ
γϣϯͰ‫͞༻ޡ‬ΕΔͷΛ๷͙ɻ
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
42
42
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
+PC3FQPTJUPSZ͕࢖͏+%#$
σʔλιʔε΍τϥϯβΫγϣ
ϯϚωʔδϟΛΧελϜՄೳ
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
43
43
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
+PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
44
44
w +PC#VJMEFS'BDUPSZɺ4UFQ#VJMEFS'BDUPSZ͕ඇਪ঑Խ͞Εͨ
w ֤'BDUPSZ#FBO΋ࣗಈతʹ࡞੒͞Εͳ͘ͳͬͨ
@Bea
n

public Job demoJob(JobRepository jobRepository, Step step)
{

return new JobBuilder(demoJob, jobRepository
)

.start(step
)

.build()
;

}
@Bea
n

public Job demoJob(Step step)
{

return jobBuilderFactory.get(“demoJob
)

.start(step
)

.build()
;

}
7
7
+PCͷ#FBO࡞੒ํ๏
˞+PC3FQPTJUPSZ͕಺෦Ͱੜ੒͞Ε͍ͯΔ͜ͱ͕෼͔ΓͮΒ͘ϛεϦʔυ͢ΔͨΊվળ͞Εͨɻ
˞ඇਪ঑Ͱ͸͋Δ͕ɺࣗલͰຊ'BDUPSZΛ#FBOԽ͢Ε͹4QSJOH#BUDIͰ΋ར༻‫ܧ‬ଓՄೳ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCBUDIJTTVFT
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCBUDIXJLJ4QSJOH#BUDI.JHSBUJPO(VJEFKPCCVJMEFSGBDUPSZBOETUFQCVJMEFSGBDUPSZCFBOFYQPTVSFDPO
fi
HVSBUJPO
+PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
45
45
@Bea
n

public Step demo01Step(JobRepository jobRepository
,

PlatformTransactionManager tm, Tasklet tasklet)
{

return new StepBuilder(demoTasklet, jobRepository
)

.tasklet(tasklet, tm
)

.build()
;

}
@Bea
n

public Step demo01Step(Tasklet tasklet)
{

return stepBuilderFactory.get(“demoTasklet
)

.tasklet(tasklet
)

.build()
;

}
7
7
4UFQͷ#FBO࡞੒ํ๏
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCBUDIXJLJ4QSJOH#BUDI.JHSBUJPO(VJEFUSBOTBDUJPONBOBHFSCFBOFYQPTVSFDPO
fi
HVSBUJPO
˞+PC3FQPTJUPSZ༻ͷτϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։Խ͞ΕͨͨΊɺ
ɹ4UFQͰ࢖༻͢ΔτϥϯβΫγϣϯϚωʔδϟΛ໌ࣔతʹࢦఆ͢Δඞཁ͋Γ
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
46
46
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
47
[+|-]ύϥϝʔλ໊(ύϥϝʔλͷ‫=)ܕ‬ύϥϝʔλͷ஋
ύϥϝʔλ໊=ύϥϝʔλͷ஋,ύϥϝʔλͷ‫ܕ‬,identificationFla
g

o
r

ύϥϝʔλ໊='{value: ύϥϝʔλͷ஋, “type:ύϥϝʔλͷ‫ܕ‬,
identifying: “boolean஋”}’
7
7
w δϣϒύϥϝʔλʢ‫ى‬ಈҾ਺ʣʹ࢖͑Δ‫ܕ‬ͷ੍໿͕؇࿨͞Εͨ
w δϣϒύϥϝʔλͷࢦఆ‫ܕ͕ࣜܗ‬ͷվળʹ߹Θͤͯ‫ݟ‬௚͞Εͨ
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMTVQQPSUGPSBOZUZQFBTBKPCQBSBNFUFS
࢖༻Մೳͳ‫ܕ‬ QBSBNFUFS5ZQF ͸TUSJOH MPOH EPVCMF EBUFͷΈ
w ‫ܕ‬ QBSBNFUFS5ZQF ͸ɺGVMMZRVBMJ
fi
FEͳ‫໊ܕ‬ʢྫɿKBWBUJNF-PDBM%BUFʣɺলུ࣌͸
4USJOHɻ࢖༻Մೳͳ‫ܕ‬͸$POWFSTJPO4FSWJDFʹΑΓ֦ுՄೳɻ
w JEFOUJ
fi
DBUJPO'MBH͸ɺδϣϒΠϯελϯεΛಛఆ͢ΔΩʔʹ‫ؚ‬ΊΔ͔൱͔ʢলུ࣌͸USVFʣ
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
48
48
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
͋·Γ࢖ΘΕͳ͔ͬͨͨΊ
ʢʴ+BLBSUBҠ২ʁʣ
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
49
49
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
ςʔϒϧ 7ˠ7ͷมߋ
#5$)@+0#@9$65*0/ ҎԼΧϥϜͷ࡟আʢ+43࡟আʣ
w +0#@$0/'*(635*0/@-0$5*0/
#5$)@+0#@9$65*0/@13.4 ҎԼΧϥϜͷ࡟আ
w 5:1@$%
w 
,:@/.
w 453*/(@7-
w %5@7-
w 
-0/(@7-
w %06#-@7-
ҎԼΧϥϜͷ௥Ճ
w 13.53@/.
w 13.53@5:1
w 13.53@7-6
ʢδϣϒύϥϝʔλͷ‫ܕ‬վળʣ
%#εΩʔϚͷมߋ
50
w +PC3FQPTJUPSZ͕ར༻͢Δ%#ςʔϒϧͷߏ੒͕มߋ͞Εͨ
w 4QSJOH#BUDI͔ΒΞοϓσʔτ͢Δ৔߹͸ɺςʔϒϧͷϚΠά
Ϩʔγϣϯ͕ඞཁ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCBUDIXJLJ4QSJOH#BUDI.JHSBUJPO(VJEFEBUBCBTFTDIFNBVQEBUFT
֤%#੡඼޲͚ͷϚΠάϨʔγϣϯ༻%%-͸ɺTQSJOHCBUDIDPSFKBSͷҎԼʹ഑ஔ͞Ε͍ͯΔɻ
PSHTQSJOHGSBNFXPSLCBUDIDPSFNJHSBUJPO
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
51
51
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
*UFN3FBEFSͰSFDPSETΛੜ੒
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
52
52
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
53
@SpringBootApplicatio
n

@EnableBatchProcessin
g

public class BatchDemo01Application
{

…
@SpringBootApplicatio
n

//@EnableBatchProcessin
g

public class BatchDemo01Application
{

…
7
7
w 4QSJOH#BUDI·Ͱ͸!OBCMF9YY͕ඞཁ͕ͩͬͨɺෆཁʹͳͬͨɻ
w ෇༩ͯ͠͠·͏ͱ+PC͕‫ى‬ಈ͠ͳ͍ࣄ৅͕ൃੜ͢ΔͷͰ஫ҙ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFFOBCMFCBUDIQSPDFTTJOHJTOPXEJTDPVSBHFE
˞৽ઃ͞Εͨ%FGBVMU#BUDI$PO
fi
HVSBUJPOͷ֦ுʹΑΓɺVUP$PO
fi
Hͷ্ॻ͖ઃఆ͕Մೳɻ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCBUDIJTTVFT
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
54
54
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
%FGBVMU#BUDI$PO
fi
HVSBUJPO
55
55
w !OBCMF#BUDI1SPDFTTJOHҎ֎ͷ৽ͨͳ4QSJOH#BUDIॳ‫ظ‬Խखஈ
w 4QSJOH#PPUͷVUP$PO
fi
Hͱͷซ༻͕Մೳ
@Configuratio
n

class MyBatchConfiguration extends DefaultBatchConfiguration
{

@Overrid
e

protected Charset getCharset()
{

// σϑΥϧτUTF-8͔Βมߋ
return StandardCharsets.ISO_8859_1
;

}

}

7
ར༻ྫˍσϑΥϧτઃఆΛมߋ͢Δྫ
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTBQJPSHTQSJOHGSBNFXPSLCBUDIDPSFDPO
fi
HVSBUJPOTVQQPSU%FGBVMU#BUDI$PO
fi
HVSBUJPOIUNM
˞ྨࣅͨ͠‫ػ‬ೳΛ͜Ε·Ͱఏ‫͍ͨͯ͠ڙ‬#BUDI$PO
fi
HVSFS͸ഇࢭ
4QSJOH#BUDI͔Βͷมߋʢൈਮʣ
56
56
w +BWB͕ϕʔεϥΠϯ
w .BQϕʔε+PC3FQPTJUPSZͷഇࢭ
w τϥϯβΫγϣϯϚωʔδϟ#FBO͕ඇެ։
w !OBCMF#BUDI1SPDFTTJOHʹଐੑ௥Ճ
w +PC΍4UFQͷ#FBO࡞੒ํ๏ͷมߋ
w δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ
w +43 K#BUDI ࣮૷ͷ࡟আ
w %#εΩʔϚͷมߋ
w +BWBSFDPSET +BWB ΁ͷରԠ
w 4QSJOH#PPUͰ!OBCMF#BUDI1SPDFTTJOH͕ෆཁ
w %FGBVMU#BUDI$PO
fi
HVSBUJPO
w 4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMXIBUTOFXIUNMXIBUT/FX
4QSJOH#PPUͷෳ਺+PC࣮ߦ‫ػ‬ೳͷഇࢭ
57
$ java -jar myapp.jar -Dspring.batch.job.names=Job໊※
JobҾ਺໊1=஋1 JobҾ਺໊2=஋2 ...
˞ΧϯϚ۠੾Ͱෳ਺ࢦఆՄೳɺলུ࣌͸શ+PC͕‫ى‬ಈ
$ java -jar myapp.jar -Dspring.batch.job.name=Job໊※
JobҾ਺໊1=஋1 JobҾ਺໊2=஋2 ...
7
7
˞ΧϯϚ۠੾Ͱෳ਺ࢦఆෆՄɺলུ࣌͸+PC͕‫͋Ͱݸ‬Δඞཁ͋Γ
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ4QSJOH#PPU.JHSBUJPO(VJEFTQSJOHCBUDIDIBOHFT
ෳ਺+PCΛ࿈ଓ࣮ߦ͢Δ‫ػ‬ೳ͕ഇࢭ͞Εͨɻ
ύϥϝʔλ໊΋OBNFTˠOBNFʹมߋ͞Ε͍ͯΔͨΊ஫ҙɻ
ΞδΣϯμ
w4QSJOH#BUDIͱ͸ʁ
w5BTLMFUWT$IVOL
w4QSJOH#BUDI
w4QSJOH#BUDI͔Βͷมߋ
w৽‫ػ‬ೳ
58
w৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ
w৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू
59
৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ
60
4QSJOH΍4QSJOH#PPUͷ(SBBM7.ωΠςΟϒαϙʔτʹΑΓɺ
4QSJOH#BUDIΞϓϦέʔγϣϯ΋ωΠςΟϒϏϧυʹରԠ
ʢ4QSJOH΍4QSJOH#PPUͷωΠςΟϒαϙʔτࣗମʹ͍ͭͯ͸ׂѪʣ
60
όονΞϓϦέʔγϣϯͱͯ͠ͷ‫ظ‬଴
w ‫ى‬ಈ࣌ؒͷ୹ॖʢΦϯϥΠϯΞϓϦέʔγϣϯΑΓޮՌ͕େ͖͍ʣ
w όονͳΒͰ͸ͷෳࡶ‫ॲࢉܭ‬ཧͷ୹ॖʢྫ͑͹େྔιʔτͳͲʣ
ͬͦ͘͞‫ͯ͠ূݕ‬ΈΔ
(SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬
61
61
4UFQɿ4QSJOH*OJUJBMJ[SͰ4QSJOH#BUDIϓϩδΣΫτΛੜ੒
(SBBM7./BUJWF4VQQPSU
4QSJOH#BUDI
)%BUBCBTF
Λ%FQFOEFODZʹ௥Ճ
ϛχϚϜͳόονΞϓϦέʔγϣϯΛωΠςΟϒϏϧυ͠ɺ‫ى‬ಈ࣌ؒΛൺֱͯ͠ΈΔ
IUUQTTUBSUTQSJOHJP
ࠓճ͸.BWFO
(SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬
62
62
4UFQɿۭͷ5BTLMFUΛ࣮૷͠ɺ+PC΍4UFQʹ૊ΈࠐΉ
@Bea
n

public Tasklet demoTakslet()
{

return new Tasklet()
{

@Overrid
e

public RepeatStatus execute(StepContribution stepContribution
,

ChunkContext chunkContext) throws Exception
{

log.info(test tasklet 01.)
;

return RepeatStatus.FINISHED
;

}

}
;

}

// ҎԼུ
(SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬
63
63
4UFQɿ+7.Ͱ࣮ߦ͠‫ى‬ಈ࣌ؒΛ֬ೝ
$ mvn package
...
$ java -jar target/demo-batch-native-0.0.1-SNAPSHOT.jar
...
Started DemoBatchNativeApplication in 2.706 seconds (process
running for 3.398)
...
Step: [demoTasklet] executed in 17ms
...
Job: [SimpleJob: [name=demoJob]] completed with the following
parameters: [{}] and the following status: [COMPLETED] in 43ms
...
(SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬
64
64
4UFQɿCVJMEQBDLTͰωΠςΟϒϏϧυʢ%PDLFSඞཁʣ
$ mvn -Pnative spring-boot:build-image
...
[INFO] [creator] [1/7] Initializing... (15.3s @ 0.15GB)
[INFO] [creator] [2/7] Performing analysis... [********] (221.6s @ 2.13GB)
[INFO] [creator] [3/7] Building universe... (34.7s @ 2.88GB)
[INFO] [creator] [4/7] Parsing methods... [*****] (23.0s @ 1.97GB)
[INFO] [creator] [5/7] Inlining methods... [***] (14.5s @ 2.43GB)
[INFO] [creator] [6/7] Compiling methods... [*************] (177.1s @ 2.48GB)
[INFO] [creator] [7/7] Creating image... (16.4s @ 3.38GB)
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:17 min
[INFO] Finished at: 2023-03-08T22:39:04+09:00
[INFO] Final Memory: 32M/120M
[INFO] ------------------------------------------------------------------------
ʢࢀߟʣ%PDLFS%FTLUPQʹ$16(#ׂ౰!.BDCPPL
(SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬
65
65
4UFQɿωΠςΟϒ࣮ߦ͠‫ى‬ಈ࣌ؒΛ֬ೝ
$ docker run --rm -p 8080:8080 docker.io/library/demo-batch-
native:0.0.1-SNAPSHOT
...
Started DemoBatchNativeApplication in 0.046 seconds (process
running for 0.069)
...
Step: [demoTasklet] executed in 1ms
...
Job: [SimpleJob: [name=demoJob]] completed with the following
parameters: [{}] and the following status: [COMPLETED] in 3ms
...
(SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬
66
66
ൺֱ
‫఺؍‬ +7. ωΠςΟϒ
‫ى‬ಈ࣌ؒ NT NT
4UFQ࣮ߦ࣌ؒ
ۭ5BTLMFU
NT NT
+PC࣮ߦ࣌ؒ NT NT
‫ى‬ಈ࣌ؒͷׂ߹͕ଟ͘઎ΊΔɺ୹໋ͷόονॲཧͷ৔߹ޮՌ͕େ͖͍
ʢྫɿ୹प‫ظ‬తʹ‫܁‬Γฦ͠‫ى‬ಈ͞ΕΔ૟আόονʗ1PMMJOHόονͳͲʣ
w৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ
w৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू
67
৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू
68
4QSJOH#BUDI4QSJOH#PPU
+PC
4UFQ
4UFQ
4UFQ
;JQLJO౳
.JDSPNFUFS
4QSJOH΍.JDSPNFUFSͷ0CTFSWBCJMJUZ‫ػ‬ೳͷ࢓૊ΈΛ༻͍ͨɺ
όονॲཧͷτϨʔεऩूʹରԠʢ+PC4UFQʣ
68
όονॲཧͷੑೳղੳʢϘτϧωοΫ෼ੳʣ΍
ΩϟύγςΟϓϥϯͳͲʹ‫༻׆‬Մೳ
3FQPSU
৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू
+PC࣮ߦ୯ҐʹτϨʔε͕੾ΒΕɺ4UFQ୯Ґʹεύϯ͕੾ΒΕΔ
+PC
EFNP@
4UFQ
EFNP@UBTLMFU
3FTU5FNQMBUF
IUUQHFU 
4UFQ
EFNP@DIVOL
ߏ੒ྫ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
69
৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू
+PC࣮ߦ୯ҐʹτϨʔε͕੾ΒΕɺ4UFQ୯Ґʹεύϯ͕੾ΒΕΔ
+PC
EFNP@
4UFQ
EFNP@UBTLMFU
3FTU5FNQMBUF
IUUQHFU 
4UFQ
EFNP@DIVOL
ߏ੒ྫ
τϨʔεऩू݁Ռ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
70
৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू
+PC࣮ߦ୯ҐʹτϨʔε͕੾ΒΕɺ4UFQ୯Ґʹεύϯ͕੾ΒΕΔ
+PC
EFNP@
4UFQ
EFNP@UBTLMFU
3FTU5FNQMBUF
IUUQHFU 
4UFQ
EFNP@DIVOL
ߏ੒ྫ
τϨʔεऩू݁Ռ
*UFN3FBEFS
*UFN1SPDFTTPS
*UFN8SJUFS
δϣϒɿτϨʔε
4UFQɿεύϯ 4UFQɿεύϯ
3FTU5FNQMBUFɿεύϯ
4QSJOHຊମͷ‫ػ‬ೳ
εύϯର৅֎
71
.JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO
4UFQɿҎԼͷ#FBO1PTU1SPDFTTPSΛ#FBOఆٛ
@Bea
n

public static BatchObservabilityBeanPostProcesso
r

batchObservabilityBeanPostProcessor()
{

return new BatchObservabilityBeanPostProcessor()
;

}

ຊདྷɺ!OBCMF#BUDI1SPDFTTJOHͰ༗ޮʹͳΔ͕ɺ
4QSJOH#PPUར༻࣌͸!OBCMF#BUDI1SPDFTTJOHΛར༻Ͱ͖ͳ͍ͨΊɺ
4QSJOH#PPU࣌఺Ͱ͸ࣗલఆٛ͢Δඞཁ͕͋Δɻ
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMNPOJUPSJOHBOENFUSJDTIUNMUSBDJOH
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUQVMM
72
.JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO
4UFQɿ4QSJOHDUVBUPS΍.JDSPNFUFSͷ૊ΈࠐΈʢ.BWFOͷ৔߹ʣ
dependency


groupIdorg.springframework.boot/groupId


artifactIdspring-boot-starter-actuator/artifactId


/dependency


dependency


groupIdio.micrometer/groupId


artifactIdmicrometer-tracing-bridge-brave/artifactId


/dependency


dependency


groupIdio.zipkin.reporter2/groupId


artifactIdzipkin-reporter-brave/artifactId


/dependency


dependency !-- Spring MVC/WebFluxະ࢖༻࣌ʹඞཁ --


groupIdio.zipkin.reporter2/groupId


artifactIdzipkin-sender-urlconnection/artifactId


/dependency
#SBWF‫ܦ‬༝Ͱ;JQLJOʹૹ৴͢Δ৔߹ͷྫɻͦͷଞͷτϨʔαʔ࣮૷ར༻΋ՄೳʢϦϑΝϨϯεࢀরʣɻ
IUUQTEPDTTQSJOHJPTQSJOHCPPUEPDTSFGFSFODFIUNMTJOHMFBDUVBUPSNJDSPNFUFSUSBDJOHHFUUJOHTUBSUFE
73
.JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO
4UFQɿBQQMJDBUJPOQSPQFSUJFT PSZNM ʹτϨʔεؔ࿈ͷઃఆ
spring.application.name=batchdem
o

management.tracing.sampling.probability=1.
0

management.zipkin.tracing.endpoint=http://localhost:9411/api/v2/span
s

ʜQSPCBCJMJUZ͸τϨʔεऩूͷαϯϓϦϯά཰ɺͰऩूɻ
FOEQPJOU͸;JQLJOͷΤϯυϙΠϯτΛࢦఆ͢Δ͕ɺ্‫ه‬͸σϑΥϧτ஋ͷͨΊলུՄೳ
4UFQɿΞϓϦέʔγϣϯ͕ॲཧ‫͙͢ʹޙྃ׬‬ϓϩηεऴྃ͠ͳ͍Α͏ʹ͢Δ
public static void main(String[] args
)	
throws InterruptedException
{

ConfigurableApplicationContext contex
t

= SpringApplication.run(BatchDemo01Application.class, args)
;

Thread.sleep(10000)
;

System.exit(SpringApplication.exit(context))
;

}

Ϛγϯঢ়‫ʹگ‬Αͬͯ͸τϨʔε৘ใ͕ඈ͹ͳ͍έʔε͕‫ݟ‬ΒΕͨͷͰɺϫʔΫΞϥ΢ϯυͱͯ͠ඵ଴‫ػ‬ɻ
74
.JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO
4UFQɿ;JQLJOαʔόͷߏங
$ docker run -d -p 9411:9411 openzipkin/zipkin
IUUQT[JQLJOJPQBHFTRVJDLTUBSUIUNM
75
$ curl -sSL https://zipkin.io/quickstart.sh | bash -s
$ java -jar zipkin.jar
0S
IUUQMPDBMIPTU
8FCϒϥ΢βͰӈ‫ه‬63-ʹΞΫηε
.JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO
4UFQɿόονΞϓϦέʔγϣϯͷ࣮ߦ
76
4UFQɿ;JQLJOը໘Ͱʮ36/263:ʯΛԡԼ
τϨʔεʢʹ+PC࣮ߦʣ͕දࣔ͞ΕΔ
.JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO
4UFQɿόονΞϓϦέʔγϣϯͷ࣮ߦ
77
4UFQɿ;JQLJOը໘Ͱʮ36/263:ʯΛԡԼ
τϨʔεʹ‫·ؚ‬ΕΔεύϯʢʹ4UFQ࣮ߦͳͲʣ͕දࣔ͞ΕΔ
w৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ
w৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू
w ৽‫ػ‬ೳͰͳ͍͚Ͳɿ.JDSPNFUFSʹΑΔϝτϦΫεऩू
78
৽‫ػ‬ೳͰͳ͍͚Ͳɿ.JDSPNFUFSʹΑΔϝτϦΫεऩू
79
4QSJOH#BUDI4QSJOH#PPU
+PC
4UFQ
4UFQ
4UFQ
1SPNFUIFVT
1VTIHBUFXBZ౳
.JDSPNFUFS
4QSJOH΍.JDSPNFUFSͷ0CTFSWBCJMJUZ‫ػ‬ೳͷ࢓૊ΈΛ༻͍ͨɺ
όονॲཧͷϝτϦΫεऩूʹରԠ 4QSJOH#BUDI
79
ϓϩηε͕ඇৗறͷͨΊ1SPNFUIFVT͔Β௚઀QVMMͰ͖ͳ͍ͨΊɺ
QVTIHBUFXBZΛհͯ͠1SPNFUIFVTʹऩू͢Δɻ
ৄࡉ͸ҎԼͷຘ͞Μͷ೥ͷϒϩάΛࢀর
$MPVE'PVOESZ্Ͱ࣮ߦͨ͠4QSJOH#BUDIΞϓϦͷ.FUSJDTΛ1SPNFUIFVT1VTIHBUFXBZʹૹΔ
IUUQTCMPHJLBNFOUSJFT
1SPNFUIFVT౳ (SBGBOB౳
1VTI
4DSBQF %BUBTPVSDF
৽‫ػ‬ೳͰͳ͍͚Ͳɿ.JDSPNFUFSʹΑΔϝτϦΫεऩू
4QSJOH#BUDI͕ެ։͢ΔϝτϦΫε
IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMNPOJUPSJOHBOENFUSJDTIUNMCVJMUJONFUSJDT
IUUQTEPDTTQSJOHJPTQSJOHCPPUEPDTSFGFSFODFIUNMBDUVBUPSIUNMBDUVBUPSNFUSJDTTVQQPSUFE
4QSJOH#PPUඪ४ͷϝτϦΫε
+7.৘ใʢ)FBQɺεϨου਺౳ʣ΍$16ɺ‫ى‬ಈ࣌ؒͳͲ
.JDSPNFUFSʹΑΔϝτϦΫεऩूɿ࣮૷ํ๏ 1VTIHBUFXBZ
4UFQɿ4QSJOHDUVBUPS΍.JDSPNFUFSͷ૊ΈࠐΈʢ.BWFOͷ৔߹ʣ
dependency


groupIdorg.springframework.boot/groupId


artifactIdspring-boot-starter-actuator/artifactId


/dependency


dependency


groupIdio.micrometer/groupId


artifactIdmicrometer-registry-prometheus/artifactId


/dependency


dependency


groupIdio.prometheus/groupId


artifactIdsimpleclient_pushgateway/artifactId


/dependency


81
IUUQTEPDTTQSJOHJPTQSJOHCPPUEPDTSFGFSFODFIUNMBDUVBUPSIUNMBDUVBUPSNFUSJDTFYQPSUQSPNFUIFVT
.JDSPNFUFSʹΑΔϝτϦΫεऩूɿ࣮૷ํ๏ 1VTIHBUFXBZ
4UFQɿBQQMJDBUJPOQSPQFSUJFT PSZNM ʹ1VTIHBUFXBZૹ৴ͷઃఆ
management.metrics.distribution.percentiles-histogram.spring.batch=tru
e

management.prometheus.metrics.export.pushgateway.enabled=tru
e

management.prometheus.metrics.export.base-url=http://localhost:909
1

management.prometheus.metrics.export.pushgateway.job=batchdem
o

management.prometheus.metrics.export.pushgateway.shutdown-operation: pus
h

4UFQɿ1VTIHBUFXBZ1SPNFUIFVT(SBGBOBΛߏஙʢུʣ
scrape_configs:
- job_name: 'pushgateway'
honor_labels: true
static_configs:
- targets:
- 'host.docker.internal:9091'
ᶃ1SPNFUIFVTˠ1VTIHBUFXBZͷεΫϨΠϐϯάઃఆ
ɹ QSPNFUIFVTZNM
82
ᶄ(SBGBOBˠ1SPNFUIFVTͷσʔλιʔεࢀরઃఆ
ɹ(SBGBOBͷ(6*ίϯιʔϧ 8FCϒϥ΢β ͔ΒՄೳ
ᶄ
ᶃ
1PSU 1PSU
.JDSPNFUFSʹΑΔϝτϦΫεऩूɿ࣮૷ํ๏ 1VTIHBUFXBZ
4UFQɿ(SBGBOBμογϡϘʔυ 8FCϒϥ΢β Ͱͷ֬ೝ
83
)FBQ΍$16ෛՙͳͲͷ
4QSJOH#PPU͕ऩू͢Δ
ඪ४ϝτϦΫε͕‫ݟ‬ΕΔ
IUUQTHSBGBOBDPNHSBGBOBEBTICPBSET
TQSJOHCPPUTUBUJTUJDT
4QSJOH#PPU4UBUJTUJDT
μογϡϘʔυΛద༻
.JDSPNFUFSʹΑΔϝτϦΫεऩूɿ࣮૷ํ๏ 1VTIHBUFXBZ
4UFQɿ(SBGBOBμογϡϘʔυ 8FCϒϥ΢β Ͱͷ֬ೝ4QSJOH#BUDIϝτϦΫε
84
IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCBUDICMPCNBJOTQSJOH
CBUDITBNQMFTTSDHSBGBOBTQSJOHCBUDIEBTICPBSEKTPO
ҎԼͷμογϡϘʔυΛద༻ +PCͷ࣮ߦ࣌ؒ΍
νϟϯΫॲཧͷεϧʔϓοτ͕‫ݟ‬ΕΔ
·ͱΊ
85
w 4QSJOH#BUDI
ˠ4QSJOHੈ୅ͷόονॲཧϑϨʔϜϫʔΫ
w 4QSJOH#BUDI͔Βͷมߋ఺
ˠ+PC4UFQొ࿥΍%#εΩʔϚɺ
ɹ4QSJOH#PPUར༻࣌ͷ!OBCMF99ʹ஫ҙ
w 4QSJOH#BUDIͷ৽‫ػ‬ೳ
ˠωΠςΟϒαϙʔτɺ0CTFSWBCJMJUZ

What's new in Spring Batch 5