ååãŸã§ã«ãWebã¢ããªã±ãŒã·ã§ã³éçºã®å倧èŠçŽ ïŒSpring Core, MVC, JPA, SecurityïŒã®ç¥èãåºãŸããŸããã
ä»åããã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®çšæ§ãšæ§èœãåäžãããããã®ãã¯ããã¯ã«é²ã¿ãŸããWebã¢ããªã±ãŒã·ã§ã³ã®æ§èœäœäžã®å€§ããªåå ã®äžã€ã¯ãåŠçã®åŸ ã¡æéã§ãã
ä»åã¯ããã®åŸ
ã¡æéãè§£æ¶ããã¢ããªã±ãŒã·ã§ã³ãé«éåãã**éåæåŠçïŒAsynchronous ProcessingïŒ**ã®åºæ¬ãšãSpring Bootã§éåæåŠçãç°¡åã«å®çŸãã @Async ã¢ãããŒã·ã§ã³ã®äœ¿ãæ¹ãåŠã³ãŸãã
1. åæåŠçãšéåæåŠçã®éã
Spring MVCã®Controllerããªã¯ãšã¹ããåãä»ããéãéåžžããã®åŠçã¯**åæåŠçïŒSynchronous ProcessingïŒ**ãšããŠå®è¡ãããŸãã
1-1. åæåŠçïŒSynchronousïŒ
- ç¹åŸŽ: åŠçAãå®äºãããŸã§ã次ã®åŠçBã¯åŸ æ©ããŸãã
- åé¡ç¹: DBãžã®æžã蟌ã¿ããå€éšAPIãšã®éä¿¡ãªã©ãæéã®ãããåŠçãå«ãŸããŠãããšããã®éããªã¯ãšã¹ããåãä»ããã¹ã¬ããïŒåŠçã®å®è¡åäœïŒããããã¯ãããã¯ã©ã€ã¢ã³ãïŒãŠãŒã¶ãŒïŒã¯ã¬ã¹ãã³ã¹ãåŸ ãããç¶ããŸãã
1-2. éåæåŠçïŒAsynchronousïŒ
- ç¹åŸŽ: åŠçAãéå§ããåŸãå®äºãåŸ ããã«ããã«æ¬¡ã®åŠçBãžé²ã¿ãŸããæéã®ãããåŠçAã¯ãå¥ã®ã¹ã¬ããã«ä»»ããŠããã¯ã°ã©ãŠã³ãã§å®è¡ãããŸãã
- ã¡ãªãã: ã¯ã©ã€ã¢ã³ããžã®ã¬ã¹ãã³ã¹ãããã«è¿ãããšãã§ããWebã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¬ããããããã¯ãããã«æžã¿ãåæã«å€ãã®ãªã¯ãšã¹ããåŠçã§ããããã«ãªããŸãã
2. Spring Bootã§éåæåŠçãæå¹ã«ããïŒ@EnableAsync
Spring Bootã¢ããªã±ãŒã·ã§ã³ã§ @Async ã¢ãããŒã·ã§ã³ã䜿çšããããã«ã¯ããŸãéåæåŠçãæå¹ã«ããå¿
èŠããããŸãã
ã¡ã€ã³ã¯ã©ã¹ããŸãã¯ä»»æã® @Configuration ã¯ã©ã¹ã« @EnableAsync ã¢ãããŒã·ã§ã³ãä»äžããã ãã§å®äºããŸãã
Java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync; // â ããã远å
@SpringBootApplication
@EnableAsync // â¡ éåææ©èœãæå¹å
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3. ã¡ãœãããéåæã§å®è¡ããïŒ@Async
éåæã§å®è¡ãããServiceå±€ã®ã¡ãœããã« @Async ã¢ãããŒã·ã§ã³ãä»äžããŸãã
äŸãã°ãããŠãŒã¶ãŒç»é²åŸã«ã¡ãŒã«ãéä¿¡ããããšããåŠçã¯ããŠãŒã¶ãŒãåŸ ã€å¿ èŠã®ãªãããã¯ã°ã©ãŠã³ãåŠçãšããŠæé©ã§ãã
Java
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class EmailService {
// ãã®ã¡ãœããã¯åŒã³åºãå
ãšã¯å¥ã®ã¹ã¬ããã§å®è¡ããã
@Async
public void sendWelcomeEmail(String emailAddress) {
System.out.println("ãéåæåŠçãã¡ãŒã«éä¿¡åŠçéå§ãã¹ã¬ããå: " + Thread.currentThread().getName());
// å€éšAPIåŒã³åºããåŸ
æ©åŠçãã·ãã¥ã¬ãŒã·ã§ã³
try {
Thread.sleep(5000); // 5ç§ãããåŠç
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("ãéåæåŠçã" + emailAddress + " ãžã®ã¡ãŒã«éä¿¡ãå®äºããŸããã");
}
// ...
}
3-1. Controllerã§ã®åŒã³åºããšå¹æ
Controllerã¯ããã® @Async ã¡ãœãããéåžžã®ã¡ãœãããšåæ§ã«åŒã³åºãã ãã§ãã
Java
@RestController
@RequiredArgsConstructor
public class UserController {
private final EmailService emailService;
@PostMapping("/users")
public String registerUser(UserRegistrationForm form) {
// ... (ãŠãŒã¶ãŒç»é²åŠç)
// ã¡ãŒã«éä¿¡ãåŒã³åºãã
// åŒã³åºãåŽã¹ã¬ããã¯ãEmailServiceã®åŠçå®äºãåŸ
ããã«ããã«æ¬¡ã®è¡ãžé²ãã
emailService.sendWelcomeEmail(form.getEmail());
// ã¯ã©ã€ã¢ã³ãã«å³åº§ã«ã¬ã¹ãã³ã¹ãè¿ã
return "ãŠãŒã¶ãŒç»é²ãå®äºããŸãããã¡ãŒã«ã¯ããã¯ã°ã©ãŠã³ãã§éä¿¡äžã§ãã";
}
}
ãã®çµæããŠãŒã¶ãŒã¯ã¡ãŒã«éä¿¡ã«5ç§ããã£ãŠããããã«ã¬ã¹ãã³ã¹ãåãåãããšãã§ããã¢ããªã±ãŒã·ã§ã³å šäœã®å¿çæ§ãåäžããŸãã
4. å®è¡çµæãååŸããïŒFuture/CompletableFuture
éåæåŠçã®å®è¡çµæïŒæ»ãå€ïŒããåŸããåŒã³åºãå
ã§å©çšãããå Žåãã¡ãœããã®æ»ãå€ã®åã Future ãŸã㯠CompletableFuture ã«ããå¿
èŠããããŸãã
Java
import java.util.concurrent.CompletableFuture;
@Service
public class CalculationService {
// æ»ãå€ã®åã CompletableFuture<çµæã®å> ã«ãã
@Async
public CompletableFuture<Integer> calculateComplexValue(int input) {
int result = input * 100; // æéã®ãããèšç®
// çµæã CompletableFuture.completedFuture ã§ã©ããããŠè¿ã
return CompletableFuture.completedFuture(result);
}
}
åŒã³åºãå
ã§ã¯ããã® CompletableFuture ãªããžã§ã¯ããåãåãã.get() ã¡ãœããã§çµæãååŸã§ããŸãããã ãã.get() ãåŒã³åºããšçµæãåŸããããŸã§åŸ
æ©ããŠããŸããããéåæã®ã¡ãªãããæå€§éã«æŽ»ããã«ã¯ãä»ã®éåææäœãšé£æºãããããã® thenApply ãªã©ã®ã¡ãœããã䜿ãããšãæšå¥šãããŸãã
â æ¬æ¥ã®ãŸãšã
- åæåŠçã¯åŠçã®å®äºãåŸ ã€ãããæéã®ãããåŠçããããšå¿çæ§ãäœäžããã
- éåæåŠçã¯ãæéã®ãããåŠçãå¥ã®ã¹ã¬ããã§å®è¡ããããšã§ãå¿çæ§ãåäžãããã
@EnableAsyncãConfigurationã¯ã©ã¹ã«ä»äžããããšã§ãéåææ©èœãæå¹åããã@AsyncãServiceã¡ãœããã«ä»äžããããšã§ããã®ã¡ãœãããéåæã§å®è¡ã§ããã- éåæåŠçã®å®è¡çµæãå©çšãããå Žåã¯ãæ»ãå€ã®åã
FutureãŸãã¯CompletableFutureã«ããã
ð æ¬¡åäºå
éåæåŠçãå°å ¥ããããšã§æ§èœã¯äžãããŸããããã¢ããªã±ãŒã·ã§ã³ã®å®è¡ç°å¢ã¯ãµãŒããŒã ãã§ã¯ãããŸããã宿çãªãããåŠçããç¹å®ã®æéã«å®è¡ãããåŠçïŒäŸ: æ¥æ¬¡éèšãããŒã¿ã®ããã¯ã¢ããïŒããããŸãã
次åã¯ãSpring Bootã§å®æçãªåŠçãç°¡åã«å®çŸãã ã¹ã±ãžã¥ãŒãªã³ã°ã®æ©èœã@Scheduled ã¢ãããŒã·ã§ã³ã®äœ¿ãæ¹ãåŠã³ãŸãã
次åïŒã第32åãã¢ããªã±ãŒã·ã§ã³ã®èªååïŒãã¹ã±ãžã¥ãŒãªã³ã°ïŒ@ScheduledïŒã®æŽ»çšã ã«ãæåŸ ãã ããïŒ


ã³ã¡ã³ã