1

由于某种原因,方法内部的上下文doAfterSuccessOrError无法从上游获得(填充)。我尝试使用Mono.subscriberContext()(见截图)访问它。我希望它存在,但由于某种原因没有。难道我做错了什么?

public class LoggingRequestExchangeFunction implements ExchangeFilterFunction {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Override
    public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
        long start = System.currentTimeMillis();

        return next.exchange(request).doAfterSuccessOrError((res, ex) -> {
            Mono.subscriberContext().map((ctx -> {
                log.info("doAfterSuccessOrError Context {}",ctx);
                // log req/res ...
                return ctx;
            })).subscribe();

        }).subscriberContext( ctx -> {
            log.info("SubscriberContext: {}" , ctx);
            return ctx;
        });
    }
}

这是一个日志输出

23:16:59.426  INFO [reactor-http-epoll-2] .p.c.LoggingRequestExchangeFunction [] SubscriberContext: Context1{nexmo-tracing-context=TracingContext{{traceId=f04961da-933a-4d1d-85d5-3bea2c47432f, clientIp=N/A}}}
23:16:59.589  INFO [reactor-http-epoll-2] .p.c.LoggingRequestExchangeFunction [] doAfterSuccessOrError Context Context0{}
4

1 回答 1

3

原因是您在doAfterSuccessOrError其中创建了一个新的 Mono,它独立于原始反应器链,因为您单独订阅它。

如果您只想在里面记录一些东西,您的替代方法是使用doOnEach信号类型旁边的运算符,您也可以访问上下文。

Mono.just("hello")
    .doOnEach((signal) ->
            {
                if (signal.isOnError() || signal.isOnComplete())
                {
                    Context ctx = signal.getContext();

                    log.info("doAfterSuccessOrError Context {}",ctx);
                    // log req/res ...
                }
            })
    .subscriberContext( ctx -> {
            log.info("SubscriberContext: {}" , ctx);
            return ctx;
      })
    .subscribe();
于 2019-08-04T08:05:13.230 回答