私はSpring Bootを使用して小さなRESTを作ろうとしています。 Spring(Java 7)を使用したことがありません。Springで非同期の残りの部分を作る方法は?
私はPythtonとC#だけを使っています(しかし、私が言ったように、すでにJavaを使いました)。
これで、非同期メソッドを使用してRESTを作成しようとしていますが、いくつかの例をチェックしましたが、これを行うための正しい方法がわかりません。
次のドキュメントを見て:
サービス:
@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);
}
}
リポジトリhttp://carlmartensen.com/completablefuture-deferredresult-async、Javaの8は、私は春で使用できるCompletableFuture
を持っているので、私は次のコードを作りました:
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);
}
}
は2つの方法の違いはありますか?
次に、以下のガイドを参照してください:https://spring.io/guides/gs/async-method/SpringBootApplication
クラスに注釈があります。 注釈を含めて、最後のリンクのコードのようにasyncExecutor
Beanを作成すると、/test
エンドポイントでは何も返されません(200 OK応答のみですが、空白の本体があります)。
したがって、残りの部分は@EnableAsync
アノテーションなしで非同期ですか? @EnableAsync
を使用すると、応答本文は空白になりますか?
ありがとうございます! @Async
アノテーションがUserRepositoryクラスのfindEmailの方法で使用するため
controller.test()とservice.findByEmail()にスレッド名を記録することができます。私は操作が非同期ではないと思う。 –