3 回答
TA贡献1860条经验 获得超8个赞
每当您使用 Spring-webflux 时,您都必须记住一件事。即你不必打破你的链条。因为有必要,有人应该在你的链上调用订阅。因为它适用于 RXJava 规范。
如果你打破了链条,那么你必须打电话,block()这是不推荐的。
您必须按以下方式修改您的代码。
让我们假设您有一个处理程序正在调用您的collectEnvironmentData()方法,并且您的方法正在调用远程服务。
public Mono<ServerResponse> handelerMethod(ServerRequest request){
return collectEnvironmentData().flatMap(aVoid -> ServerResponse.ok().build());
}
你的方法应该修改为
public Mono<Void> collectEnvironmentData() throws JAXBException {
ReportRequest report = new ReportRequest();
report.setVersion("1.0");
RestClient client = null;
try {
client = RestClientBuilder.builder()
.gatewayUrl(URL2)
// .token(contract.getTerminal_token())
// .usernamePassword("user", "password")
// .truststore(new File("server.pem"))
// .sslCertificate(new File("client.pem"), new File("clientKey.p8"),
//"secret").build();
} catch (SSLException e) {
e.printStackTrace();
}
return client.executeOnly(report);
}
按照上述方式改变你的实现,希望它能奏效。
TA贡献1825条经验 获得超6个赞
我将如何实现你的方法是:
public Mono<Void> executeOnly(ReportRequest transaction) {
Mono<ReportRequest> transactionMono = Mono.just(transaction);
return client.post().uri(gatewayUrl)
.accept(MediaType.APPLICATION_XML)
.contentType(MediaType.APPLICATION_XML)
.body(transaction, ReportRequest.class)
.exchange()
.then();
}
然后我会按如下方式使用它:
client.executeOnly(report).subscribe()
TA贡献1757条经验 获得超7个赞
将 更改method return type为Mono<Void>进行端到端流式传输。
public void collectEnvironmentData() throws JAXBException {
ReportRequest report = new ReportRequest();
report.setVersion("1.0");
RestClient client = null;
try {
client = RestClientBuilder.builder()
.gatewayUrl(URL2)
.build();
} catch (SSLException e) {
e.printStackTrace();
}
return client.executeOnly(report);
}
或者您也可以订阅Mono
client.executeOnly(report).subscribe();
添加回答
举报