我正在尝试从我的身体中获取一个元素作为 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日更新:
我没有找到一个令人满意的解决方案,我们也不是真正的粉丝解析身体两次,我们因此放弃这样做。
暂无答案!
目前还没有任何答案,快来回答吧!