如何处理来自WebClient的异步响应?

时间:2018-05-16 14:00:59

标签: java spring spring-webflux

我试图使用WebClient来发出大量的Http POST请求。 我将reactor.ipc.netty上的日志记录级别设置为DEBUG以查看正在发送的请求。

这是一个正常运作的代码:

@Service
public class HttpService implements IHttpService {

    private static final String URL = "http://blablabla.com/bla";

    private static final Logger logger = LogManager.getLogger();

    @Autowired
    WebClient webClient;

    @Override
    public void push(Data data) {
        String body = constructString(data);
        Mono<ClientResponse> res = webClient.post()
                .uri(URL + getLogType(data))
                .contentLength(body.length())
                .contentType(MediaType.APPLICATION_JSON)
                .syncBody(body)
                .exchange();
        ClientResponse resp = res.block();
        logger.debug("Status : " + resp.statusCode());
        logger.debug("Body : " + resp.bodyToMono(String.class));
    }
}

它生成那种日志:

2018-05-16 15:54:14.642 DEBUG 19144 --- [ctor-http-nio-4] r.i.n.channel.ChannelOperationsHandler   : [id: 0x439f7819, L:/127.0.0.1:56556 - R:blablabla.com/127.0.0.1:8069] Writing object DefaultHttpRequest(decodeResult: success, version: HTTP/1.1)
POST /bla HTTP/1.1
user-agent: ReactorNetty/0.7.7.RELEASE
host: blablabla.com/bla:8069
accept: */*
accept-encoding: gzip
Content-Length: 494
Content-Type: application/json

但是当我删除ClientResponse resp = res.block();时,我再也看不到日志......所以我甚至不知道请求是否得到处理。 我怎样才能在收到回复后立即处理回复? 我试过res.doOnSuccess(clientResponse -> logger.debug("Code : " + clientResponse.statusCode()));,但没有成功......

1 个答案:

答案 0 :(得分:3)

由于FluxMono是反应流类型,因此它们也很懒惰:在subscribe之前没有任何反应。有几种方法可以实现这一目标,其中包括subscribeblock

通常,Spring WebFlux应用程序不直接subscribe并实际返回那些被动类型;在你的情况下没有更多的背景,我无法真正说出这里最合适的方法。

查看Reactor project reference documentation on Flux and Mono,这有助于您了解其背后的核心原则。