Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

What's new in Spring Batch 5

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 85 Publicité

Plus De Contenu Connexe

Similaire à What's new in Spring Batch 5 (20)

Publicité

What's new in Spring Batch 5

  1. 1. 8IBU`TOFXJO 4QSJOH#BUDI +46(4QSJOH'FTU +46(ελοϑɹ஑୩ɹஐߦ
  2. 2. ࣗ‫঺ݾ‬հ w೔ຊ4QSJOHϢʔβձ +46( ελοϑ w๭4*FSͰιϑτ΢ΣΞΞʔΩςΫτ ʢ࣮ଶ͸؅ཧ‫ۀ‬຿ଟΊɾɾɾʣ w๭ॻͷචऀͷҰਓ IUUQTXXXTIPFJTIBDPKQCPPLEFUBJM 2
  3. 3. 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
  4. 4. ΞδΣϯμ w4QSJOH#BUDIͱ͸ʁ w5BTLMFUWT$IVOL w4QSJOH#BUDI w4QSJOH#BUDI͔Βͷมߋ w৽‫ػ‬ೳ 4
  5. 5. ΞδΣϯμ w4QSJOH#BUDIͱ͸ʁ w5BTLMFUWT$IVOL w4QSJOH#BUDI w4QSJOH#BUDI͔Βͷมߋ w৽‫ػ‬ೳ 5
  6. 6. όονॲཧͱ͸ʁ 6 Ұൠతʹɺόονॲཧͱ͸ʮ·ͱΊͯҰ‫ॲׅ‬ཧ͢Δʯ͜ͱΛࢦ͢ɻ IUUQTUFSBTPMVOBCBUDIHJUIVCJPHVJEFMJOFDVSSFOUKBTJOHMF@JOEFYIUNM$I@(FOFSBM#BUDI1SPDFTT όονॲཧΛ࠾༻͢Δ໨త wεϧʔϓοτͷ޲্ wʢΦϯϥΠϯॲཧͷʣԠ౴ੑͷ֬อ w࣌ؒ΍Πϕϯτ΁ͷରԠ w֎෦γεςϜͱͷ࿈‫্ܞ‬ͷ੍໿ ‫ٻ‬ΊΒΕΔཁ݅ wੑೳ޲্ wҟৗൃੜ࣌ͷϦΧόϦ wଟ༷ͳ‫ى‬ಈํࣜ w͞·͟·ͳೖग़ྗΠϯλϑΣʔε
  7. 7. όονॲཧͱ͸ʁ 7 Ұൠతʹɺόονॲཧͱ͸ʮ·ͱΊͯҰ‫ॲׅ‬ཧ͢Δʯ͜ͱΛࢦ͢ɻ IUUQTUFSBTPMVOBCBUDIHJUIVCJPHVJEFMJOFDVSSFOUKBTJOHMF@JOEFYIUNM$I@(FOFSBM#BUDI1SPDFTT όονॲཧΛ࠾༻͢Δ໨త wεϧʔϓοτͷ޲্ wʢΦϯϥΠϯॲཧͷʣԠ౴ੑͷ֬อ w࣌ؒ΍Πϕϯτ΁ͷରԠ w֎෦γεςϜͱͷ࿈‫্ܞ‬ͷ੍໿ ‫ٻ‬ΊΒΕΔཁ݅ wੑೳ޲্ wҟৗൃੜ࣌ͷϦΧόϦ wଟ༷ͳ‫ى‬ಈํࣜ w͞·͟·ͳೖग़ྗΠϯλϑΣʔε 4QSJOH#BUDI ͕αϙʔτ
  8. 8. 4QSJOH#BUDIͱ͸ʁ 8 4QSJOHϑϨʔϜϫʔΫΛϕʔεͱͨ͠ɺ όονॲཧ޲͚+BWBΞϓϦέʔγϣϯϑϨʔϜϫʔΫ IUUQTTQSJOHJPCBUDI
  9. 9. 4QSJOH#BUDIͱ͸ʁ 9 w ॲཧͷྲྀΕΛఆ‫ܕ‬Խ͢Δ‫ػ‬ೳʢλεΫϨοτɺνϟϯΫʣ w ༷ʑͳ‫ى‬ಈํ๏ʢίϚϯυϥΠϯɺ4FSWMFU౳ʣ w ༷ʑͳσʔλ‫ࣜܗ‬ͷೖग़ྗʢϑΝΠϧɺ%#ɺΩϡʔɺ౳ʣ w ॲཧͷޮ཰Խʢଟॏ࣮ߦɺฒྻ࣮ߦɺ৚݅෼‫ذ‬ɺ౳ʣ w δϣϒͷ؅ཧʢ࣮ߦঢ়‫گ‬ͷӬଓԽɺϦελʔτɺ౳ʣ IUUQTUFSBTPMVOBCBUDIHJUIVCJPHVJEFMJOFDVSSFOUKBTJOHMF@JOEFYIUNM$I@4QSJOH#BUDISDI@0WFSWJFX ఏ‫͞ڙ‬ΕΔ୅දతͳ‫ػ‬ೳ
  10. 10. 4QSJOH#BUDIͷ‫ج‬ຊߏ੒ 10 4QSJOH#BUDI +PC-BVODIFS +PC IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO fi HVSF+PC +PC3FQPTJUPSZ +PC +PC 4UFQ 4UFQ 4UFQ *UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS ॲཧͷྲྀΕ ؅ཧσʔλͷྲྀΕ
  11. 11. 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ʹ෼ׂ ࣮ͯ͠૷͠‫ͼݺ‬ग़͢ɻ
  12. 12. 4QSJOH#BUDIͷ‫ج‬ຊߏ੒ 12 4QSJOH#BUDI +PC-BVODIFS +PC IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO fi HVSF+PC +PC3FQPTJUPSZ +PC +PC 4UFQ 4UFQ 4UFQ *UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS ॲཧͷྲྀΕ ؅ཧσʔλͷྲྀΕ 4UFQ ॲཧͷ࣮૷΍࣮ߦ؅ཧΛߦ͏࠷খ୯Ґɻͭͷ+PCΛෳ਺ͷ4UFQʹ෼ׂͯ͠ ॲཧ͢Δ͜ͱʹΑΓɺॲཧͷ࠶ར༻ɺฒྻԽɺ৚݅෼‫͕ذ‬ՄೳʹͳΔɻ νϟϯΫϞσϧ·ͨ͸λεΫϨοτϞσϧͷ͍ͣΕ͔Ͱ࣮૷͢Δɻ
  13. 13. 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͕ఏ‫͢ڙ‬Δ࣮૷ ʢ%#ɺϑΝΠϧͷೖग़ྗॲཧͳͲʣΛར༻͢Δɻ
  14. 14. 4QSJOH#BUDIͷ‫ج‬ຊߏ੒ 14 4QSJOH#BUDI +PC-BVODIFS +PC IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMKPCIUNMDPO fi HVSF+PC +PC3FQPTJUPSZ +PC +PC 4UFQ 4UFQ 4UFQ *UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS ॲཧͷྲྀΕ ؅ཧσʔλͷྲྀΕ +PC3FQPTJUPSZ +PC΍4UFQͷ࣮ߦঢ়ଶɺ݁ՌΛ֎෦%#Ͱ؅ཧ͢ΔͨΊͷΠϯλʔϑΣΠε ‫ۀ‬຿ϩδοΫͱ͸ผτϥϯβΫγϣϯͰ%#ΞΫηεɻ ʢӬଓԽͨ͘͠ͳ͍৔߹͸ɺ)౳ͷΠϯϝϞϦ%#ʹ֨ೲͤ͞‫ͤ͞ൃش‬Δʣ
  15. 15. ࢀߟɿ+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Ҿ਺
  16. 16. )FMMP8PSME 16 4QSJOH#BUDI )%BUBCBTF Λ%FQFOEFODZʹ௥Ճ IUUQTTUBSUTQSJOHJP ޷ΈͰ.BWFO 4UFQɿ4QSJOH*OJUJBMJ[SͰ4QSJOH#BUDIϓϩδΣΫτΛੜ੒ ˞4QSJOH#PPUར༻લఏ
  17. 17. )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ར༻લఏ
  18. 18. )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ར༻લఏ
  19. 19. )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ొ࿥
  20. 20. )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ར༻લఏ δϣϒύϥϝʔλ Λऔಘ ϩάʹδϣϒύϥϝʔλΛग़ྗ
  21. 21. )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Λ࡞੒
  22. 22. )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Λ࡞੒
  23. 23. )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
  24. 24. )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ར༻લఏ δϣϒύϥϝʔλ͕ਖ਼͘͠දࣔ͞Εͨ
  25. 25. ΞδΣϯμ w4QSJOH#BUDIͱ͸ʁ w5BTLMFUWT$IVOL w4QSJOH#BUDI w4QSJOH#BUDI͔Βͷมߋ w৽‫ػ‬ೳ 25
  26. 26. 5BTLMFUͱ͸ʁ$IVOLͱ͸ʁ 26 5BTLMFUϞσϧ ‫ۀ‬຿ϩδοΫ $IVOLϞσϧ ‫ۀ‬຿ϩδοΫ ࣗ༝ʹίʔυΛ૊Ή ϧʔϓ੍‫ޚ‬ ʢνϟϯΫ ୯Ґʣ *UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS ઃఆ֦ு ઃఆ֦ு ઃఆ֦ு ͬ͘͟Γͷҧ͍
  27. 27. @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ʹొ࿥
  28. 28. $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ఏ‫ڙ‬Ϋϥεʹઃఆద༻
  29. 29. $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ʣ
  30. 30. @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ఏ‫ڙ‬Ϋϥεʹઃఆద༻
  31. 31. ࢀߟɿ୅දతͳ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
  32. 32. ࢀߟɿ5BTLMFUͱ$IVOLͷؔ܎ 32 4QSJOH#BUDIશମ૾ https://terasoluna-batch.github.io/guideline/current/ja/single_index.html#Ch02_SpringBatchArch_Arch_BusinessLogic
  33. 33. ࢀߟɿ5BTLMFUͱ$IVOLͷؔ܎ 33 4QSJOH#BUDIશମ૾ https://terasoluna-batch.github.io/guideline/current/ja/single_index.html#Ch02_SpringBatchArch_Arch_BusinessLogic ͍ΘΏΔ5BTLMFU ͍ΘΏΔ$IVOL
  34. 34. ಛ௃ 34 ‫఺؍‬ 5BTLMFUϞσϧ $IVOLϞσϧ ߟ࡯ ‫ۀ‬຿ϩδοΫ ‫ه‬ड़ͷࣗ༝౓ ࣗ༝౓ߴ͍ ʢϩδοΫશͯΛ։ൃऀ ͕‫ه‬ड़ʣ ࣗ༝౓௿͍ ʢ3FBEFSɺ1SPDFTTPSɺ 8SJUFSͷ૊Έ߹Θͤʣ $IVOL͸ઃ‫ߏͰ఺࣌ܭ‬଄ ҙ͕ࣝඞཁͰɺ5BTLMFUΑ Γ΋ֶशίετߴ͍ɻ τϥϯβΫγ ϣϯ ̍τϥϯβΫγϣϯ ݅਺ʗνϟϯΫαΠζ ʹ෼ׂ ϦϥϯͰϦΧόϦ͍ͨ͠ ৔߹͸5BTLMFUɺ ϦελʔτͰϦΧόϦ΍ େྔσʔλॲཧʹ͸ $IVOLɻ Ϧελʔτ ະରԠ ରԠ https://terasoluna-batch.github.io/guideline/current/ja/single_index.html#Ch03_ChunkOrTasklet
  35. 35. ΞδΣϯμ w4QSJOH#BUDIͱ͸ʁ w5BTLMFUWT$IVOL w4QSJOH#BUDI w4QSJOH#BUDI͔Βͷมߋ w৽‫ػ‬ೳʢωΠςΟϒαϙʔτɺ 0CTFSWBCJMJUZʣ 35
  36. 36. 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
  37. 37. 4QSJOH#BUDIͷαϙʔτ‫ؒظ‬ 37 IUUQTTQSJOHJPQSPKFDUTTQSJOHCBUDITVQQPSU
  38. 38. ΞδΣϯμ w4QSJOH#BUDIͱ͸ʁ w5BTLMFUWT$IVOL w4QSJOH#BUDI w4QSJOH#BUDI͔Βͷมߋ w৽‫ػ‬ೳ 38
  39. 39. 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
  40. 40. 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
  41. 41. 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༻ͷτϥϯβΫ γϣϯϚωʔδϟ͕ΞϓϦέʔ γϣϯͰ‫͞༻ޡ‬ΕΔͷΛ๷͙ɻ
  42. 42. 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͕࢖͏+%#$ σʔλιʔε΍τϥϯβΫγϣ ϯϚωʔδϟΛΧελϜՄೳ
  43. 43. 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
  44. 44. +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
  45. 45. +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Ͱ࢖༻͢ΔτϥϯβΫγϣϯϚωʔδϟΛ໌ࣔతʹࢦఆ͢Δඞཁ͋Γ
  46. 46. 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. 47. δϣϒύϥϝʔλͷ‫ܕ‬ɺࢦఆ‫ࣜܗ‬ͷมߋ 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ʣ
  48. 48. 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Ҡ২ʁʣ
  49. 49. 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
  50. 50. ςʔϒϧ 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
  51. 51. 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Λੜ੒
  52. 52. 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
  53. 53. 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
  54. 54. 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
  55. 55. %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͸ഇࢭ
  56. 56. 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
  57. 57. 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ʹมߋ͞Ε͍ͯΔͨΊ஫ҙɻ
  58. 58. ΞδΣϯμ w4QSJOH#BUDIͱ͸ʁ w5BTLMFUWT$IVOL w4QSJOH#BUDI w4QSJOH#BUDI͔Βͷมߋ w৽‫ػ‬ೳ 58
  59. 59. w৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ w৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू 59
  60. 60. ৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ 60 4QSJOH΍4QSJOH#PPUͷ(SBBM7.ωΠςΟϒαϙʔτʹΑΓɺ 4QSJOH#BUDIΞϓϦέʔγϣϯ΋ωΠςΟϒϏϧυʹରԠ ʢ4QSJOH΍4QSJOH#PPUͷωΠςΟϒαϙʔτࣗମʹ͍ͭͯ͸ׂѪʣ 60 όονΞϓϦέʔγϣϯͱͯ͠ͷ‫ظ‬଴ w ‫ى‬ಈ࣌ؒͷ୹ॖʢΦϯϥΠϯΞϓϦέʔγϣϯΑΓޮՌ͕େ͖͍ʣ w όονͳΒͰ͸ͷෳࡶ‫ॲࢉܭ‬ཧͷ୹ॖʢྫ͑͹େྔιʔτͳͲʣ ͬͦ͘͞‫ͯ͠ূݕ‬ΈΔ
  61. 61. (SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬ 61 61 4UFQɿ4QSJOH*OJUJBMJ[SͰ4QSJOH#BUDIϓϩδΣΫτΛੜ੒ (SBBM7./BUJWF4VQQPSU 4QSJOH#BUDI )%BUBCBTF Λ%FQFOEFODZʹ௥Ճ ϛχϚϜͳόονΞϓϦέʔγϣϯΛωΠςΟϒϏϧυ͠ɺ‫ى‬ಈ࣌ؒΛൺֱͯ͠ΈΔ IUUQTTUBSUTQSJOHJP ࠓճ͸.BWFO
  62. 62. (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 ; } } ; } // ҎԼུ
  63. 63. (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 ...
  64. 64. (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
  65. 65. (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 ...
  66. 66. (SBBM7.ωΠςΟϒαϙʔτɿ‫ى‬ಈ࣌ؒͷ‫ূݕ‬ 66 66 ൺֱ ‫఺؍‬ +7. ωΠςΟϒ ‫ى‬ಈ࣌ؒ NT NT 4UFQ࣮ߦ࣌ؒ ۭ5BTLMFU NT NT +PC࣮ߦ࣌ؒ NT NT ‫ى‬ಈ࣌ؒͷׂ߹͕ଟ͘઎ΊΔɺ୹໋ͷόονॲཧͷ৔߹ޮՌ͕େ͖͍ ʢྫɿ୹प‫ظ‬తʹ‫܁‬Γฦ͠‫ى‬ಈ͞ΕΔ૟আόονʗ1PMMJOHόονͳͲʣ
  67. 67. w৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ w৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू 67
  68. 68. ৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू 68 4QSJOH#BUDI4QSJOH#PPU +PC 4UFQ 4UFQ 4UFQ ;JQLJO౳ .JDSPNFUFS 4QSJOH΍.JDSPNFUFSͷ0CTFSWBCJMJUZ‫ػ‬ೳͷ࢓૊ΈΛ༻͍ͨɺ όονॲཧͷτϨʔεऩूʹରԠʢ+PC4UFQʣ 68 όονॲཧͷੑೳղੳʢϘτϧωοΫ෼ੳʣ΍ ΩϟύγςΟϓϥϯͳͲʹ‫༻׆‬Մೳ 3FQPSU
  69. 69. ৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू +PC࣮ߦ୯ҐʹτϨʔε͕੾ΒΕɺ4UFQ୯Ґʹεύϯ͕੾ΒΕΔ +PC EFNP@ 4UFQ EFNP@UBTLMFU 3FTU5FNQMBUF IUUQHFU 4UFQ EFNP@DIVOL ߏ੒ྫ *UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS 69
  70. 70. ৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू +PC࣮ߦ୯ҐʹτϨʔε͕੾ΒΕɺ4UFQ୯Ґʹεύϯ͕੾ΒΕΔ +PC EFNP@ 4UFQ EFNP@UBTLMFU 3FTU5FNQMBUF IUUQHFU 4UFQ EFNP@DIVOL ߏ੒ྫ τϨʔεऩू݁Ռ *UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS 70
  71. 71. ৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू +PC࣮ߦ୯ҐʹτϨʔε͕੾ΒΕɺ4UFQ୯Ґʹεύϯ͕੾ΒΕΔ +PC EFNP@ 4UFQ EFNP@UBTLMFU 3FTU5FNQMBUF IUUQHFU 4UFQ EFNP@DIVOL ߏ੒ྫ τϨʔεऩू݁Ռ *UFN3FBEFS *UFN1SPDFTTPS *UFN8SJUFS δϣϒɿτϨʔε 4UFQɿεύϯ 4UFQɿεύϯ 3FTU5FNQMBUFɿεύϯ 4QSJOHຊମͷ‫ػ‬ೳ εύϯର৅֎ 71
  72. 72. .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
  73. 73. .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
  74. 74. .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
  75. 75. .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-ʹΞΫηε
  76. 76. .JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO 4UFQɿόονΞϓϦέʔγϣϯͷ࣮ߦ 76 4UFQɿ;JQLJOը໘Ͱʮ36/263:ʯΛԡԼ τϨʔεʢʹ+PC࣮ߦʣ͕දࣔ͞ΕΔ
  77. 77. .JDSPNFUFSʹΑΔτϨʔεऩूɿ࣮૷ํ๏ ;JQLJO 4UFQɿόονΞϓϦέʔγϣϯͷ࣮ߦ 77 4UFQɿ;JQLJOը໘Ͱʮ36/263:ʯΛԡԼ τϨʔεʹ‫·ؚ‬ΕΔεύϯʢʹ4UFQ࣮ߦͳͲʣ͕දࣔ͞ΕΔ
  78. 78. w৽‫ػ‬ೳɿ(SBBM7.ωΠςΟϒαϙʔτ w৽‫ػ‬ೳɿ.JDSPNFUFSʹΑΔτϨʔεऩू w ৽‫ػ‬ೳͰͳ͍͚Ͳɿ.JDSPNFUFSʹΑΔϝτϦΫεऩू 78
  79. 79. ৽‫ػ‬ೳͰͳ͍͚Ͳɿ.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
  80. 80. ৽‫ػ‬ೳͰͳ͍͚Ͳɿ.JDSPNFUFSʹΑΔϝτϦΫεऩू 4QSJOH#BUDI͕ެ։͢ΔϝτϦΫε IUUQTEPDTTQSJOHJPTQSJOHCBUDIEPDTSFGFSFODFIUNMNPOJUPSJOHBOENFUSJDTIUNMCVJMUJONFUSJDT IUUQTEPDTTQSJOHJPTQSJOHCPPUEPDTSFGFSFODFIUNMBDUVBUPSIUNMBDUVBUPSNFUSJDTTVQQPSUFE 4QSJOH#PPUඪ४ͷϝτϦΫε +7.৘ใʢ)FBQɺεϨου਺౳ʣ΍$16ɺ‫ى‬ಈ࣌ؒͳͲ
  81. 81. .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
  82. 82. .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
  83. 83. .JDSPNFUFSʹΑΔϝτϦΫεऩूɿ࣮૷ํ๏ 1VTIHBUFXBZ 4UFQɿ(SBGBOBμογϡϘʔυ 8FCϒϥ΢β Ͱͷ֬ೝ 83 )FBQ΍$16ෛՙͳͲͷ 4QSJOH#PPU͕ऩू͢Δ ඪ४ϝτϦΫε͕‫ݟ‬ΕΔ IUUQTHSBGBOBDPNHSBGBOBEBTICPBSET TQSJOHCPPUTUBUJTUJDT 4QSJOH#PPU4UBUJTUJDT μογϡϘʔυΛద༻
  84. 84. .JDSPNFUFSʹΑΔϝτϦΫεऩूɿ࣮૷ํ๏ 1VTIHBUFXBZ 4UFQɿ(SBGBOBμογϡϘʔυ 8FCϒϥ΢β Ͱͷ֬ೝ4QSJOH#BUDIϝτϦΫε 84 IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCBUDICMPCNBJOTQSJOH CBUDITBNQMFTTSDHSBGBOBTQSJOHCBUDIEBTICPBSEKTPO ҎԼͷμογϡϘʔυΛద༻ +PCͷ࣮ߦ࣌ؒ΍ νϟϯΫॲཧͷεϧʔϓοτ͕‫ݟ‬ΕΔ
  85. 85. ·ͱΊ 85 w 4QSJOH#BUDI ˠ4QSJOHੈ୅ͷόονॲཧϑϨʔϜϫʔΫ w 4QSJOH#BUDI͔Βͷมߋ఺ ˠ+PC4UFQొ࿥΍%#εΩʔϚɺ ɹ4QSJOH#PPUར༻࣌ͷ!OBCMF99ʹ஫ҙ w 4QSJOH#BUDIͷ৽‫ػ‬ೳ ˠωΠςΟϒαϙʔτɺ0CTFSWBCJMJUZ

×