如何在webfluxtagsprovider中使用body中的标记

yduiuuwa  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(267)

我正在尝试从我的身体中获取一个元素作为 http.requests 韵律学。我试图使用 WebFluxTagProvider 但它需要一个 Iterable<Tag> 当信息来自serverwebexchange请求主体时 Flux<DataBuffer> 这是我试过的代码

import example.companyname.dto.Log;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.micrometer.core.instrument.Tag;
import org.springframework.boot.actuate.metrics.web.reactive.server.DefaultWebFluxTagsProvider;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

@Component
public class ApplicationIdTagProvider extends DefaultWebFluxTagsProvider {

  private final Jackson2JsonDecoder jsonDecoder;

  public ApplicationIdTagProvider(final ObjectMapper objectMapper) {
    this.jsonDecoder = new Jackson2JsonDecoder(objectMapper);
  }

  @Override
  public Iterable<Tag> httpRequestTags(ServerWebExchange exchange, Throwable ex) {
    var tag = exchange.getRequest()
        .getBody()
        .map(dataBuffer ->
          (Log) jsonDecoder.decode(dataBuffer, forClass(Log.class), null, null)
        )
        .log()
        .map(log -> Tag.of("applicationId", log.getApplicationId()))
        .collectList()
        .share()
        .block();

    return tag;
  }
}

此代码在编译和运行时“起作用”,但通过调试器传递的列表是空的(结果也是空的)。
这就引出了我的两个问题:
这是解决问题的正确方法吗?
我怎样才能做到这一点?
这个 Iterable<Tag> 使我相信我被迫通过阻塞代码,而我似乎无法做到这一点 Flux<DataBuffer> 2021年4月8日更新:
我一直在研究它,我很肯定这是不可能的非阻塞代码。我不确定是否有可能做我们想做的事。关于这个特性的文档非常少。
2021年4月20日更新:
我没有找到一个令人满意的解决方案,我们也不是真正的粉丝解析身体两次,我们因此放弃这样做。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题