我正在嘗試使用Spring Boot製作一個小型REST。 很久以前從未使用Spring和Java(Java 7)!如何與Spring進行異步休息?
在過去的2年中,我只使用Pyhton和C#(但就像我說的,我已經使用Java)。所以,現在,我正在嘗試使用異步方法來創建REST,並檢查了幾個示例,但仍然不明白「正確的方法」來執行此操作。
查看以下文件:http://carlmartensen.com/completablefuture-deferredresult-async,爪哇8具有CompletableFuture
,我可以使用Spring的,所以,我做了如下代碼:
服務:
@Service
public class UserService {
private UserRepository userRepository;
// dependency injection
// don't need Autowire here
// https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-spring-beans-and-dependency-injection.html
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Async
public CompletableFuture<User> findByEmail(String email) throws InterrupedException {
User user = userRepository.findByEmail(email);
return CompletableFuture.completedFuture(user);
}
}
庫:
public interface UserRepository extends MongoRepository<User, String> {
@Async
findByEmail(String email);
}
RestController:
@RestController
public class TestController {
private UserService userService;
public TestController(UserService userService) {
this.userService = userService;
}
@RequestMapping(value = "test")
public @ResponseBody CompletableFuture<User> test(@RequestParam(value = "email", required = true) String email) throws InterruptedException {
return userService.findByEmail(email).thenApplyAsync(user -> {
return user;
})
}
}
此代碼給我預期的輸出。 然後,看着另一個文件(很抱歉,我失去了聯繫),我看到春接受以下代碼(給我的預期輸出太):
@RequestMapping(value = "test")
public @ResponseBody CompletableFuture<User> test(@RequestParam(value = "email", required = true) String email) throws InterruptedException {
return userService.findByEmail(email);
}
}
有兩種方法之間的差異?
然後,看下面的指南:https://spring.io/guides/gs/async-method/,在SpringBootApplication
類中有@EnableAsync
註釋。 如果我包含@EnableAsync
註釋並創建asyncExecutor
Bean,就像上一個鏈接的代碼一樣,我的應用程序不會在/test
端點上返回任何內容(只有200 OK響應,但帶有空白主體)。
那麼,我的休息是異步的,沒有@EnableAsync
註釋? 爲什麼當我使用@EnableAsync
時,響應主體是空白的?
謝謝!
可以記錄controller.test()和service.findByEmail()中的線程名稱。我懷疑該操作不是異步 –