gpt4 book ai didi

kotlin - 使用webflux进行上下文日志记录( header 中的相关ID)

转载 作者:行者123 更新时间:2023-12-02 13:28:32 24 4
gpt4 key购买 nike

我需要在 Controller 的协程内部的 header 中添加一些参数,并将其记录为我的请求的核心ID。
是否可以在 Controller 中使用webflux / kotlin协程并使用 header 中的参数进行上下文记录?
我知道Webflux可以使用WebFilter拦截 header 并记录它们或对其进行修改,但是可以将其发送到它将触发的协程吗?

@RestController
class ItemController(private val itemRepository: ItemRepository) {

@GetMapping("/")
suspend fun findAllItems(): List<Item> =
// do stuff
logger.log("Corelation id is : " + myCorelationIdHeaderParam) // that's the param i need
return itemService.findAll()
}

最佳答案

您可以通过在 Controller /服务中使用subscriberContext访问在webfilter中设置的任何上下文。
下面是使用 Java 的示例。您可以在Kotlin的代码中使用类似的逻辑:
您的过滤器:(此处您在“myContext”中设置 header 值“someHeaderval”)

public class MyFilter implements WebFilter {


@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String someHeaderval = request.getHeaders().get("someHeader").get(0);
return chain.filter(exchange).subscriberContext(context -> {
return context.put("myContext",someHeaderval);
});;
}

}

现在您可以在任何地方使用此上下文:
@GetMapping(value = "/myGetApi")
public Mono<String> sampleGet() {
return Mono.subscriberContext()
.flatMap(context -> {
String myHeaderVal = (String)context.get("myContext");
//do logging with this header value
return someService.doSomething(myHeaderVal);
});
}

关于kotlin - 使用webflux进行上下文日志记录( header 中的相关ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62783337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com