ããã«ã¡ã¯ãHabrïŒ
ä»é±ãå°å·äŒç€Ÿããã®æ°ããSpring 5ã®
æ¬ãæåŸ
ããŠããŸãã
Spring 5ã®è峿·±ãæ©èœã®äžã§ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã¯ç¹ã«èšåãã䟡å€ããããŸãããã®ãã¬ãŒã ã¯ãŒã¯ã§ã®å®è£
ã¯ãMatt Raibleã®ææ¡èšäºã§ç°¡åã«èª¬æãããŠããŸãã åè¿°ã®æ¬ã§ã¯ããªã¢ã¯ãã£ããã¿ãŒã³ã«ã€ããŠã¯ç¬¬11ç« ã§èª¬æããŠããŸãã
ãããã¯
ãæšå¹Žå€ã«ãªãªãŒã¹ã
ãã JavaãšSpringã«é¢ãããã1ã€ã®çŽ æŽãããæ¬ã
Java in the Cloud ãã®èè
ã§ããJosh Longã®å
±èã§ãã
ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã¯ãé«è² è·ã«èããã·ã¹ãã ãæ§ç¯ããæ¹æ³ã§ãã ãµãŒããŒãéããããã³ã°ã§ãããã¯ã©ã€ã¢ã³ãããã»ã¹ãå¿çãåŸ
ã€å¿
èŠããªãããã巚倧ãªãã©ãã£ãã¯ã®åŠçã¯ãã¯ãåé¡ã§ã¯ãããŸããã ã¯ã©ã€ã¢ã³ãã¯ããµãŒããŒäžã§ããã°ã©ã ãã©ã®ããã«å®è¡ãããããçŽæ¥èгå¯ããŠããããšåæããããšã¯ã§ããŸããã APIãèŠæ±ã®åŠçãå°é£ã§ãããšå€æããå Žåã§ãã劥åœãªå¿çãæäŸããå¿
èŠããããŸãã å¶åŸ¡ãããªãæ¹æ³ã§ã¡ãã»ãŒãžãæåŠããã³ç Žæ£ããªãã§ãã ããã äžäœã³ã³ããŒãã³ãã«è² è·ã®äžã§åäœããŠããããšãéç¥ãããã®è² è·ããéšåçã«è§£æŸã§ããããã«ããå¿
èŠããããŸãã ãã®ææ³ã¯ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®éèŠãªåŽé¢ã§ããããã¯ãã¬ãã·ã£ãŒãšåŒã°ããŸãã
ãã®èšäºã¯
Josh Longãšå
±åå·çããŸããã Joshã¯Javaãã£ã³ããªã³ã§ãããSpring Developer Advocateã§ãããäžè¬çã«ã¯Pivotalã§åãã°ããŒãã«ãªäººã§ãã ç§ã¯Springãšé·ãéä»äºãããŠããŸããããSpring BootãèŠããŠãããã®ã¯ãžã§ã·ã¥ã§ãããããã¯ãã«ã®ãŒã®Devoxxã«ã³ãã¡ã¬ã³ã¹ã§ã®ããšã§ããã ãã以æ¥ãç§ãã¡ã¯åŒ·ãå人ã«ãªããJavaã奜ãã§ãã¯ãŒã«ãªã¢ããªã±ãŒã·ã§ã³ãäœæããŠããŸãã
ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ãŸãã¯I / OãI / Oãç§ãã¡ã¯ä»äºã«è¡ããŸã...ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã¯ãéåæI / Oãã¢ã¯ãã£ãã«äœ¿çšãããœãããŠã§ã¢ãäœæããæ¹æ³ã§ãã éåæI / Oã¯ãããã°ã©ãã³ã°ã«å€§ããªå€åã䌎ãå°ããªã¢ã€ãã¢ã§ãã ã¢ã€ãã¢èªäœã¯åçŽã§ãïŒãªãœãŒã¹ã®éå¹ççãªå²ãåœãŠã§ç¶æ³ãä¿®æ£ããç§ãã¡ã®ä»å
¥ãªãã§ã¢ã€ãã«ç¶æ
ã«ãªã£ãŠãããªãœãŒã¹ãè§£æŸããI / Oã®å®äºãåŸ
ã¡ãŸãã éåæå
¥å/åºåã¯ãI / OåŠçãžã®éåžžã®ã¢ãããŒããéã«ããŸããã¯ã©ã€ã¢ã³ãã¯è§£æŸãããæ°ããéç¥ãåŸ
ã€ä»ã®ã¿ã¹ã¯ãå®è¡ã§ããŸãã
åæå
¥åºåãšéåæå
¥åºåã®å
±éç¹ãããã³ãããã®éããæ€èšããŠãã ããã
ãœãŒã¹ããããŒã¿ãèªã¿åãç°¡åãªããã°ã©ã ãäœæããŸãïŒå
·äœçã«ã¯ã
java.io.File
ãªã³ã¯ã«ã€ããŠèª¬æããŠããŸãïŒã å€ãè¯ã
java.io.InputStream
ã䜿çšããå®è£
ããå§ããŸãããã
äŸ1.ãã¡ã€ã«ããããŒã¿ãåæçã«èªã¿åã package com.example.io; import lombok.extern.log4j.Log4j2; import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.function.Consumer; @Log4j2 class Synchronous implements Reader { @Override public void read(File file, Consumer<BytesPayload> consumer) throws IOException { try (FileInputStream in = new FileInputStream(file)) {
- éåžžã®
java.io.File
ã§èªã¿åãããã®ãã¡ã€ã«ãæäŸããŸã - äžåºŠã«1è¡ãã€ãœãŒã¹ããçµæãååŸããŸã...
Consumer<BytesPayloadgt;
ãåãå
¥ããããã«ãã®ã³ãŒããæžãConsumer<BytesPayloadgt;
æ°ããããŒã¿ãå°çãããšãã«åŒã³åºãããŸã
ç°¡åã§ããããªãã¯äœãšèšããŸããïŒ ãã®ã³ãŒããå®è¡ãããšããã°åºåïŒåè¡ã®å·ŠåŽïŒã«è¡šç€ºããããã¹ãŠã®ã¢ã¯ã·ã§ã³ãåäžã®ã¹ã¬ããã§çºçããããšã瀺ããŸãã
ããã§ã¯ããœãŒã¹ã§ååŸããããŒã¿ãããã€ããæœåºããŸãïŒãã®å Žåã
java.io.FileInputStream
ããç¶æ¿ãã
java.io.InputStream
ãµãã¯ã©ã¹ã«ã€ããŠè©±ããŸãïŒã ãã®äŸã®äœãåé¡ã«ãªã£ãŠããŸããïŒ ãã®å Žåããã¡ã€ã«ã·ã¹ãã ã«ããããŒã¿ãæãInputStreamã䜿çšããŸãã ãã¡ã€ã«ãååšããããŒããã©ã€ããæ©èœããŠããå Žåããã®ã³ãŒãã¯æåŸ
ã©ããã«æ©èœããŸãã
ãããã
File
ã§ã¯ãªããããã¯ãŒã¯ãœã±ããããããŒã¿ãèªã¿åãã
InputStream
å¥ã®å®è£
ã䜿çšãããšã©ããªããŸããïŒ å¿é
ããããšã¯äœããããŸããïŒ ãã¡ããããããã¯ãŒã¯é床ãç¡éã«éãå Žåãå¿é
ããããšã¯ãŸã£ãããããŸããã ãããŠããããšä»ã®ããŒããšã®éã®ãããã¯ãŒã¯ãã£ãã«ã«é害ãçºçããªãå Žåã ãããã®æ¡ä»¶ãæºããããŠããå Žåãã³ãŒãã¯å®å
šã«æ©èœããŸãã
ãããããããã¯ãŒã¯ãã¹ããŒããŠã³ãŸãã¯ã¬ã€ããŠã³ãããšã©ããªããŸããïŒ ãã®å Žåãæäœ
in.read(âŠ)
ãŸã§ã®æéãå¢ããããšãæå³ã
in.read(âŠ)
ã å®éã圌女ã¯ãŸã£ããæ»ã£ãŠããªããããããŸããïŒ ããã¯ãããŒã¿ã®èªã¿åãå
ã®ã¹ããªãŒã ã§äœãä»ã®ããšãããããšãããšåé¡ã«ãªããŸãã ãã¡ããããã€ã§ãå¥ã®ã¹ããªãŒã ãäœæããŠãããããããŒã¿ãèªã¿åãããšãã§ããŸãã ããã¯ç¹å®ã®ãã€ã³ããŸã§å®è¡ã§ããŸãããæçµçã«ã¯ãããã«ã¹ã±ãŒãªã³ã°ããããã«ã¹ã¬ããã远å ããã ãã§ã¯äžååã«ãªããšããå¶éã«éããŸãã ãã·ã³äžã«ããã³ã¢ã®æ°ãè¶
ããçã®ç«¶äºã¯ãããŸããã è¡ãæ¢ãŸãïŒ ãã®å Žåã远å ã®ãããŒã®ããã«ã®ã¿å
¥åºååŠçïŒããã§ã¯èªã¿åããæå³ããŸãïŒãå¢ããããšãã§ããŸãããããã§ã¯é
ããæ©ããéçã«éããŸãã
ãã®äŸã§ã¯ãäž»ãªäœåã¯èªæžã§ããä»ã®é¢ã§ã¯ã»ãšãã©äœãèµ·ãããŸããã I / Oã«äŸåããŠããŸãã éåæãœãªã¥ãŒã·ã§ã³ãããããŒã®ç¬å ãéšåçã«å
æããã®ã«ã©ã®ããã«åœ¹ç«ã€ããæ€èšããŠãã ããã
äŸ2.ãã¡ã€ã«ããããŒã¿ãéåæã§èªã¿åã package com.example.io; import lombok.extern.log4j.Log4j2; import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousFileChannel; import java.nio.channels.CompletionHandler; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.Collections; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Consumer; @Log4j2 class Asynchronous implements Reader, CompletionHandler<Integer, ByteBuffer> { private int bytesRead; private long position; private AsynchronousFileChannel fileChannel; private Consumer<BytesPayload> consumer; private final ExecutorService executorService = Executors.newFixedThreadPool(10); public void read(File file, Consumer<BytesPayload> c) throws IOException { this.consumer = c; Path path = file.toPath();
- ä»åã¯
java.io.File
ãé©åãããããããJava NIO java.nio.file.Path
ãäœæãJava NIO java.nio.file.Path
- ç¹ã«
Channel
ãäœæãããšããå¿
èŠãªããŒã¿ã衚瀺ããããšãã«CompletionHandler
ãã³ãã©ãŒãåŒã³åºãããã«äœ¿çšãããjava.util.concurrent.ExecutorService
ãµãŒãã¹ãæå®ããŸã CompletionHandler<Integer, ByteBuffer> (this)
ãªã³ã¯ãæž¡ãããšã§èªã¿åããéå§ããŸã- ã³ãŒã«ããã¯ã§ã
ByteBuffer
ããbyte[]
容éã«èªã¿èŸŒã¿ãŸãbyte[]
Synchronous
äŸãšåæ§ã«ã byte[]
ããŒã¿ãã³ã³ã·ã¥ãŒãã«æž¡ãããŸãã
ããã«äºçŽããŸãããã®ã³ãŒãã¯ã¯ããã«é£ããããšãããããŸããïŒ ããã§éåžžã«å€ãã®ããšãè¡ãããŠããã®ã§ãé ãããã«å転ããŸãããææããŠãã ãã...ãã®ã³ãŒãã¯ã
Java NIO Channel
ããããŒã¿ãèªã¿åããã³ãŒã«ããã¯ãæ
åœããå¥ã®ã¹ã¬ããã§ãã®ããŒã¿ãåŠçããŸãã ãããã£ãŠãèªã¿åããéå§ãããã¹ããªãŒã ã¯ç¬å ãããŸããã
.read(..)
åŒã³åºããåŸãã»ãŒç¬æã«æ»ããæçµçã«ããŒã¿ãèªç±ã«äœ¿çšã§ããããã«ãªã£
.read(..)
ãã³ãŒã«ããã¯ãè¡ãããŸã-ãã§ã«å¥ã®ã¹ã¬ããã§ã
.read()
åŒã³åºãéã«é
å»¶ãããå Žåãã¹ã¬ããã§å®è¡ããããšã§ä»ã®äºé
ã«é²ãããšãã§ããŸãã æåã®ãã€ãããæåŸã®ãã€ããŸã§ã®éåæèªã¿åãæäœã®æéã¯ãããããåæèªã¿åãæäœã®æéããé·ããããŸããã éåžžãéåææäœã¯ç¡èŠã§ããã»ã©é·ããªããŸãã ãã ãããã®ãããªè¿œå ã®å°é£ã«åãçµããšããããŒããã广çã«åŠçã§ããŸãã ããå€ãã®äœæ¥ãè¡ããæéæ°ã®ã¹ã¬ãããæã€ããŒã«ã§I / Oãå€éåããŸãã
ç§ã¯ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°äŒç€Ÿã§åããŠããŸãã æ°Žå¹³ã¹ã±ãŒãªã³ã°ã®åé¡ã解決ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãååŸããŠãã ããïŒ ãã¡ãããããã§ç§ã¯å°ãäžèª å®ã§ãã éåæI / Oã¯ç¶æ³ãå°ãè€éã«ããŸããããã®äŸããªã¢ã¯ãã£ãã³ãŒãã®æçšæ§ã瀺ããŠããããšãé¡ã£ãŠããŸãïŒããã©ãŒãã³ã¹ãI / Oã«å€§ããäŸåããŠããå Žåãããå€ãã®èŠæ±ãåŠçããæ¢åã®ããŒããŠã§ã¢ã§ããå€ãã®äœæ¥ãè¡ãããšãã§ããŸãã ããã©ãŒãã³ã¹ãããã»ããµã®äœ¿çšã«äŸåããŠããå ŽåïŒããšãã°ããã£ããããæ°ã®æäœããããã³ã€ã³ã®ãã€ãã³ã°ãŸãã¯æå·åã«ã€ããŠè©±ããŠããå ŽåïŒããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã§ã¯äœãåŸãããŸããã
çŸåšãç§ãã¡ã®ã»ãšãã©ã¯æ¥åžžæ¥åã§
Channel
ãŸãã¯
InputStream
å®è£
ã䜿çšããŠããŸããïŒ ããé«ãã¬ãã«ã®æœè±¡åã®ã¬ãã«ã§åé¡ãèããå¿
èŠããããŸãã ããã¯ãé
åããŸãã¯ããã
java.util.Collection
éå±€ã®ãããªãã®ã«ã€ããŠã§ãã
java.util.Collection
ã³ã¬ã¯ã·ã§ã³ã¯ãInputStreamäžã§éåžžã«ãã衚瀺ãããŸããäž¡æ¹ã®ãšã³ãã£ãã£ã¯ããã¹ãŠã®ããŒã¿ãäžåºŠã«ãã»ãŒç¬æã«æäœã§ãããšæ³å®ããŠããŸãã ã»ãšãã©ã®
InputStreams
ããã®èªã¿åãããåŸã§ã§ã¯ãªãæ©ãçµäºã§ããããšãæåŸ
ãããŠããŸãã 倧éã®ããŒã¿ã«ç§»è¡ããå Žåãã³ã¬ã¯ã·ã§ã³ã¿ã€ãã¯å°ãäžå¿«ã«ãªããŸãã æœåšçã«ç¡éïŒç¡å¶éïŒãªãã®ïŒããšãã°ãWebãœã±ããããµãŒããŒã€ãã³ãïŒãåŠçããŠããå Žåã¯ã©ããªããŸããïŒ é²é³éã«é
å»¶ãããå Žåã¯ã©ãããã°ããã§ããïŒ
ãã®çš®ã®ããŒã¿ãèšè¿°ããããã®ããè¯ãæ¹æ³ãå¿
èŠã§ãã æçµçã«çºçãããããªéåæã€ãã³ãã«ã€ããŠè©±ããŠããã
Future<T>
ãŸãã¯
CompletableFuture<T>
ã¯ãã®ç®çã«éåžžã«é©ããŠããããã«æãããããããŸããããæçµçã«çºçããããšã1ã€ã ã説æããŠããŸãã å®éãJavaã¯ãã®çš®ã®ããŒã¿ã説æããã®ã«é©ããã¡ã¿ãã¡ãŒãæäŸããŠããŸããã Java 8ã®
Iterator
ãš
Stream
äž¡æ¹ã®ã¿ã€ãã¯ç¡é¢ä¿ãããããŸããããäž¡æ¹ãšããã«æåã§ãã ããªãèªèº«ã次ã®ãšã³ããªãèŠæ±ããŸããã¿ã€ãã¯ã³ãŒãã«ã³ãŒã«ããã¯ãéä¿¡ããã¹ãã§ã¯ãããŸããã ãã®ã±ãŒã¹ã§ããã·ã¥ããŒã¹ã®åŠçããµããŒããããŠããŠãã¹ã¬ããã¬ãã«ã§ããå€ãã®ããšãéæã§ããå ŽåãAPIã¯ã¹ã¬ããåãšã¹ã±ãžã¥ãŒãªã³ã°å¶åŸ¡ãæäŸãããšæ³å®ãããŠããŸãã
Iterator
å®è£
ã¯ã¹ã¬ããåã«ã€ããŠäœãè¿°ã¹ãŠãããããã¹ãŠã®Java 8ã¹ã¬ããã¯åãfork-joinããŒã«ãå
±æããŠããŸãã
Iterator
ãš
Stream
å®éã«ããã·ã¥åŠçããµããŒãããŠããå ŽåãI / Oã®ã³ã³ããã¹ãã§å®éã«æªåããå¥ã®åé¡ãçºçããŸããäœããã®é浞éã¡ã«ããºã ãå¿
èŠã§ãã ããŒã¿ã³ã³ã·ã¥ãŒãã¯éåæã«åŠçããããããããŒã¿ããã€ãã©ã€ã³ã«ãã€ãã©ã®ãããªéã§å
¥ããã¯ããããŸããã æ¬¡ã®ã³ãŒã«ããã¯ã§åŠçããå¿
èŠãããããŒã¿ã®éã¯ããããŸããïŒ1ãã€ããŸãã¯1ãã©ãã€ãïŒ
InputStream
ããããŒã¿ã
InputStream
ãåŠçããæºåãã§ããŠããã ãã®æ
å ±ãèªã¿åãããšãã§ãããã以äžã¯èªã¿åããŸããã åã®äŸã§ã¯ãåºå®é·ã®æ¢ç¥ã®
byte[]
ãããã¡ãŒã«ããŒã¿ãèªã¿èŸŒã¿ãŸããã éåæã³ã³ããã¹ãã§ã¯ãåŠçããããŒã¿ã®éããããã€ããŒã«äŒããæ¹æ³ãå¿
èŠã§ãã
ã¯ããå
çã 確ãã«äœããããã«ãããŸããã
æ¬ èœããŠããé phorãæ€çŽ¢ãããã®å ŽåãéåæI / Oã®æ¬è³ªãçŸããåæ ããããŒã¿ã®é転éã®ããã®ãã®ãããªã¡ã«ããºã ããµããŒããã忣ã·ã¹ãã ã®å®è¡ãããŒãå¶åŸ¡ã§ããã¡ã¿ãã¡ãŒãæ¢ããŠããŸãã ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã§ã¯ãã¯ã©ã€ã¢ã³ããåŠçã§ããè² è·ãéç¥ããæ©èœããéæµããšåŒã³ãŸãã
çŸåšããªã¢ã¯ãã£ãããã°ã©ãã³ã°ããµããŒãããVert.xãAkka StreamsãRxJavaã®åªãããããžã§ã¯ãã倿°ãããŸãã SpringããŒã ã¯
Reactorãšãããããžã§ã¯ããå®è¡ããŠããŸãã ãããã®ããŸããŸãªæšæºã®éã«ã¯ã
Reactive Streamsã€ãã·ã¢ããæšæºã§äºå®äžåŒ·èª¿ãããŠããããªãåºãäžè¬çãªãã£ãŒã«ãããããŸãã Reactive Streamsã€ãã·ã¢ããã§ã¯ã4ã€ã®ã¿ã€ããå®çŸ©ãããŠããŸãã
Publisher<T>
ã€ã³ã¿ãŒãã§ãŒã¹
Publisher<T>
; é·æçã«å°éããå¯èœæ§ã®ããå€ãçæããŸãã
Publisher<T>
ã€ã³ã¿ãŒãã§ãŒã¹
Publisher<T>
;
Subscriber<T>
ã®ã¿ã€ã
T
å€ãçæããŸãã
äŸ3.ãªã¢ã¯ãã£ãã¹ããªãŒã ïŒ Publisher<T>
ã€ã³ã¿ãŒãã§ã€ã¹ ã
package org.reactivestreams; public interface Publisher<T> { void subscribe(Subscriber<? super Tgt; s); }
Subscriber
ã¿ã€ãã¯
Publisher<T>
ãµãã¹ã¯ã©ã€ããã
onNext(T)
ã¡ãœãããä»ããŠã¿ã€ã
T
æ°ããå€ã®éç¥ãåãåããŸãã ãšã©ãŒãçºçãããšããã®
onError(Throwable)
ã¡ãœããã
onError(Throwable)
ãŸãã åŠçãæ£åžžã«å®äºãããšã
onComplete
ã¡ãœãããåŒã³åºãããŸãã
äŸ4. Jetã¹ããªãŒã ïŒ Subscriber<T>
ã€ã³ã¿ãŒãã§ã€ã¹ã package org.reactivestreams; public interface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete(); }
Subscriber
æåã«
Publisher
ã«æ¥ç¶ãããšã
Subscriber#onSubscribe
Subscription
ãåä¿¡ããŸãã ãµãã¹ã¯ãªã
Subscription
ãµãã¹ã¯ãªã
Subscription
ã¯ããããã仿§å
šäœã®äžã§æãéèŠãªéšåã§ãã ãªã¿ãŒã³ãããŒãæäŸããã®ã¯åœŒå¥³ã§ãã ãµãã¹ã¯ã©ã€ããŒãµãã¹ã¯ã©ã€ããŒã¯ã
Subscription#request
ã¡ãœããã䜿çšããŠè¿œå ããŒã¿ãèŠæ±ãããã
Subscription#cancel
ã¡ãœããã䜿çšããŠåŠçã忢ããŸãã
äŸ5.ãªã¢ã¯ãã£ãã¹ããªãŒã ïŒ Subscription<T>
ã€ã³ã¿ãŒãã§ã€ã¹ ã
package org.reactivestreams; public interface Subscription { public void request(long n); public void cancel(); }
ãªã¢ã¯ãã£ãã¹ããªãŒã ã®ä»æ§ã¯ãæããã§ã¯ãããŸãããå¥ã®äŸ¿å©ãªã¿ã€ããæäŸããŸã
Processor<A,B>
ã¯ã
Subscriber<A>
ãš
Publisher<B>
äž¡æ¹ãç¶æ¿ããåãªãã€ã³ã¿ãŒãã§ã€ã¹ã§ãã
äŸ6. Jetã¹ããªãŒã ïŒ Processor<T>
ã€ã³ã¿ãŒãã§ãŒã¹ ã
package org.reactivestreams; public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { }
仿§ã¯å®è£
ã®èŠä»¶ãšããŠäœçœ®ä»ããããŠããŸãã;å®éããã®ç®çã¯çžäºéçšæ§ããµããŒãããããã«åãå®çŸ©ããããšã§ãã ãªã¢ã¯ãã£ããããŒã«é¢é£ä»ããããã¿ã€ãã®æãããªå©ç¹ã¯ãJava 9ãªãªãŒã¹ã§å ŽæãèŠã€ãããšããããšã§ããããã«ãã»ãã³ãã£ãã¯çã«ã¯ã
java.util.concurrent.Flow
ã¯ã©ã¹ããã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å¯Ÿå¿ããã1察1ãã§ãïŒ
java.util.concurrent.Flow.Publisher
Reactorã«äŒããªã¢ã¯ãã£ãã¹ããªãŒã ã®ã¿ã€ãã ãã§ã¯äžååã§ãã ãã£ã«ã¿ãªã³ã°ã倿ãªã©ã®æäœããµããŒãããã«ã¯ããã髿¬¡ã®å®è£
ãå¿
èŠã§ãã ãã®ãããReactorãããžã§ã¯ãã¯äŸ¿å©ã§ãã Reactive Streams仿§ã«åºã¥ããŠæ§ç¯ããã2ã€ã®
Publisher<T>
ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãæäŸããŸãã
ãŸãã
Flux<T>
ã¯ãŒã以äžã®å€ãçæãã
Publisher
ã§ãã 2çªç®ã®
Mono<T>
ã¯
Publisher<T>
ããŒããŸãã¯1ã€ã®å€ãçæããŸãã ã©ã¡ããå€ãå
¬éããããã«å¿ããŠåŠçã§ããŸããããããã®æ©èœã¯Reactive Streams仿§ãããã¯ããã«åºç¯å²ã§ãã ã©ã¡ãããå€ã¹ããªãŒã ãåŠçã§ããæŒç®åãæäŸããŸãã ãªã¢ã¯ã¿ãŒã¿ã€ãã¯é©åã«æ§æãããŸã-ãã®ãã¡ã®1ã€ã®åºåã¯ä»ã®ã¿ã€ãã®å
¥åãšããŠæ©èœããã¿ã€ããä»ã®ããŒã¿ã¹ããªãŒã ãšé£æºããå¿
èŠãããå Žåã
Publisher<T>
ã€ã³ã¹ã¿ã³ã¹ã«äŸåããŸãã
Mono<T>
ãš
Flux<T>
ã©ã¡ãã
Publisher<T>
å®è£
ããŠããŸãã ã¡ãœããã¯
Publisher<T>
ã€ã³ã¹ã¿ã³ã¹ãåãå
¥ãã
Flux<T>
ãŸãã¯
Mono<T>
è¿ãããšããå§ãããŸãã ããã¯ãã¯ã©ã€ã¢ã³ããåä¿¡ããããŒã¿ã®çš®é¡ãåºå¥ããã®ã«åœ¹ç«ã¡ãŸãã
Publisher<T>
ãäžãããããã®
Publisher<T>
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ããããã«èŠæ±ããããšããŸãã
CompletableFuture<T>
ååŸã§ããã®ã§ã1ã€ã®ã¬ã³ãŒãã®è©³çްãå«ãããŒãžã衚瀺ããå¿
èŠããããŸããïŒ ãŸãã¯ããã¹ãŠã®ãšã³ããªãããŒãžããšã«è¡šç€ºããããªã¹ããŸãã¯ã°ãªããã§æŠèŠããŒãžã衚瀺ããŸããïŒ èšãã®ã¯é£ããã§ãã
ãŸãã
Flux<T>
ãš
Mono<T>
éåžžã«ç¹æ®ã§ãã
Flux<T>
åä¿¡ããå Žåã¯ã¬ãã¥ãŒããŒãžã衚瀺ãã
Mono<T>
ãåä¿¡ããå Žåã¯1ã€ã®ïŒãŸãã¯åäžã§ã¯ãªãïŒã¬ã³ãŒãã®è©³çްãå«ãããŒãžã衚瀺ããå¿
èŠãããããšãç¥ã£ãŠããŸãã
Reactorã¯ãPivoââtalã«ãã£ãŠéå§ããããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ãã ä»ã圌ã¯éåžžã«äººæ°ããããŸãã Facebookã¯ãžã§ãã
ãšã³ãžã³ã§ããã䜿çšããŠ
ãªã¢ãŒãããã·ãŒãžã£ãåŒã³åºã ãRxJavaã®äœæè
Ben Christensenã®æå°ã®äžã§
Rsocketã§ã䜿çšããŸãã Salesforceã¯ã
ãªã¢ã¯ãã£ãgRPCå®è£
ã§ããã䜿çšã
ãŸã ã Reactorã¯Reactive Streamsã¿ã€ããå®è£
ããŠããããããããã®ã¿ã€ãããµããŒãããä»ã®ãã¯ãããžãŒãããšãã°Netflixã®
RxJava 2 ã
Lightbendã® Akka Streams ãEclipse Foundationã®
Vert.xãããžã§ã¯ããš
ããåãã§ããŸãã RxJava 2ã®ãã£ã¬ã¯ã¿ãŒã§ããDavid Cairnockã¯ãPivoââtalãšå¯æ¥ã«é£æºããŠReactorãéçºãããããžã§ã¯ããããã«æ¹åããŸããã ããã«ããã¡ãããSpring Framework 4.0以éãSpring Frameworkã«ã¯äœããã®åœ¢ã§ååšããŸãã
Spring WebFluxã«ãããªã¢ã¯ãã£ãããã°ã©ãã³ã°ãã®ãã¹ãŠã®æçšæ§ã«ã€ããŠãReactorã¯åãªãåºç€ã«ãããŸããã ã¢ããªã±ãŒã·ã§ã³ã¯ããŒã¿ãœãŒã¹ãšéä¿¡ããå¿
èŠããããŸãã èªèšŒãšæ¿èªããµããŒãããå¿
èŠããããŸãã Springã¯ããããã¹ãŠæäŸããŸãã Reactorãæ¬ èœããŠããæ¯phorãæäŸããå ŽåãSpringã¯ãã¹ãŠã®äººãå
±éã®èšèªã話ãã®ãå©ããŸãã
Spring Framework 5.0ã¯2017幎9æã«ãªãªãŒã¹ãããŸãããReactorããã³Reactive Streams仿§ã«åºã¥ããŠããŸãã
Spring WebFluxãšåŒã°ããæ°ãããªã¢ã¯ãã£ãã©ã³ã¿ã€ã ããã³ã³ã³ããŒãã³ãã¢ãã«ããããŸãã
Spring WebFluxã¯ãµãŒãã¬ããAPIããç¬ç«ããŠãããåäœããå¿
èŠã¯ãããŸããã å¿
èŠã«å¿ããŠããµãŒãã¬ãããšã³ãžã³ã®äžã§äœ¿çšã§ããã¢ããã¿ãä»å±ããŠããŸãããããã¯å¿
é ã§ã¯ãããŸããã ãŸããSpring WebFluxãšåŒã°ãããŸã£ããæ°ããNettyããŒã¹ã®ã©ã³ã¿ã€ã ãæäŸããŸãã Java 8ããã³Java EE 7以éã§åäœããSpring Framework 5ã¯ãSpring Data KayãSpring Security 5ãSpring Boot 2ãSpring Cloud Finchleyãªã©ãSpringãšã³ã·ã¹ãã ã®å€ãã®åºç€ãšããŠæ©èœããŸãã