我有以下文件
1.SpringBootApplication(DealParserApiApplication)
@SpringBootApplication
@ComponentScan(basePackages = "com.parser.*")
@EnableAsync
@EnableCaching(proxyTargetClass = true)
public class DealParserApiApplication{
public static void main(String[] args) {
SpringApplication.run(DealParserApiApplication.class, args);
}
@Bean
public WebClient webClient() {
return WebClient.create();
}
}
2。控制器类DealParserAdminController,该类调用服务类中的方法evaluvateDeal
@Service
public class Evaluator implements IEvaluator {
此评估交易有许多步骤要执行,任务之一是从端点获取该交易的更多细节。
3。创建一个组件
@Component
public class DealDetails implements IDealDetails {
进行这种隔离,使方法Async
@Override
@Async
public CompletableFuture<DealDetails> getDealDetails(String URI) {
long start = Instant.now().toEpochMilli();
return CompletableFuture.supplyAsync ( () -> {
RestTemplate restTemplate = new RestTemplate();
..
..
..
DealDetails dealDetails = responseEntity.getBody();
return dealDetails
});
4。在evaluvateDeal中,我们开始做一些事情,然后打电话获取更多详细信息
line 1 : List<roles> roles= repository.findByCriteria(filters);
line 2 : Boolean Flag = rules.stream().map(Role::getRoleLevel).filter("IsManager"::equals).findFirst().isPresent();
line 3 : //Go and Grab additional details
line 4 : CompletableFuture<DealDetails> dealDetailsFut = dealDetails.getDealDetails(URI);
line 5 : DealDetails dealDetails =null;
line 6 : try {
line 7 : dealDetails = dealDetailsFut.get();
::
::
::
line 10 : dealDetails.setRoles(someObj);
当我查看控制台日志
2020-06-02 14:57:25.083 INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator :
2020-06-02 14:57:25.086 INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator :
2020-06-02 14:57:25.110 INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails :
2020-06-02 14:57:26.471 INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails :
2020-06-02 14:57:26.471 INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails :
2020-06-02 14:57:26.472 INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails :
2020-06-02 14:57:36.472 INFO 41536 --- [onPool-worker-1] c.d..service.parser.DealDetails :
2020-06-02 14:57:25.083 INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator :
2020-06-02 14:57:25.086 INFO 41536 --- [nio-8080-exec-1] c.service.parser.Evaluator :
即使我使用@Async和CompleteFuture,看来nio-8080-exec-1正在等待onPool-worker-1完成
问题:-
1。我的低估正确吗?
2。有什么办法不使MAIN线程(nio-8080-exec-1)等待吗?
谢谢