【发布时间】:2018-07-08 05:44:27
【问题描述】:
我在使用 Spring WebFlux 时遇到问题。其实我的项目是由
-
Api 包装器(基本上是使用 WebClient 调用远程服务的代码)
private final BinanceServerTimeApi binanceServerTimeApi; private final WebClient webClient; @Value("${binance.api.secret}") private String secret; @Autowired public BinanceAccountApi(@Value("${binance.api.baseurl}") String baseUrl, @Value("${binance.api.key}") String key, BinanceServerTimeApi binanceServerTimeApi) { this.binanceServerTimeApi = binanceServerTimeApi; this.webClient = WebClient.builder() .baseUrl(baseUrl) .defaultHeader("X-MBX-APIKEY",key) .build(); } public Mono<AccountInformation> getAccountInformation() { Mono<ResponseServerTime> responseServerTime = binanceServerTimeApi.getServerTime(); String apiEndpoint = "api/v3/account?"; String queryParams = "recvWindow=50000×tamp=" + responseServerTime.block().getServerTime(); String signature = HmacSHA256Signer.sign(queryParams, secret); String payload = apiEndpoint+queryParams+"&signature="+signature; log.info("final url for getAccountInformation is {}", payload); return this.webClient.get().uri(payload).accept(MediaType.APPLICATION_JSON) .retrieve().bodyToMono(AccountInformation.class).log(); } -
我的 javascript 客户端使用的端点
@Autowired
private BinanceAccountApi binanceAccountApi; public Mono<ServerResponse> getAccountPortfolio(ServerRequest request) { return binanceAccountApi.getAccountInformation() .flatMap(accountInformation -> ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) .body(fromObject(accountInformation))).log(); } -
这是我的主要课程
@Bean public RouterFunction<ServerResponse> route(AccountHandler handler) { return RouterFunctions .route(GET("/route/accountInformation").and(accept(MediaType.APPLICATION_JSON)),handler::getAccountPortfolio); }
当我到达这条路线 /route/accountInformation 时,第一个调用工作正常,但其他调用正在等待处理(服务器从不发送响应)。
请注意,对端点的第一次调用会持续 2000 毫秒。 这是我对 WebFlux 项目的第一种方法,我试图弄清楚它是如何工作的。
【问题讨论】:
标签: spring spring-boot spring-webflux