gpt4 book ai didi

multithreading - 多个线程调用同一函数的问题

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

我的代码中有两次对应用程序的rest调用,即使该调用是指向同一终结点的,我也想在千分尺之间进行区分。为此,我试图添加一个新的字段,如下所示

@Component
class MyMeterFilter : MeterFilter {

var isRequired: Boolean = false
override fun map(id: Meter.Id): Meter.Id {
return if (id.name.startsWith("http")) {
id.withTag(Tag.of("extra.tag", isRequired.toString()))
} else id
}

}

在进行第一个调用之前,我将isRequired字段设置为true,在第二个调用之前,将其设置为false(两个调用都是从singleton bean异步的)。但是从代码中可以看到,由于仅创建了该类的一个实例,因此在两个调用之间将覆盖isRequired的值。我该如何避免呢?

最佳答案

如果它基于发出调用的线程,则ThreadLocal可以保持该状态,则MeterFilter可以对其进行检查,只需确保在完成操作后清除ThreadLocal

看来您正在尝试在http.server.request指标上设置其他标签,对吗?那很聪明。

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class MetricDecoratingFilter : OncePerRequestFilter(), MeterFilter {
private val additionalTags = ThreadLocal<Tags>()

override fun doFilterInternal(req: HttpServletRequest, resp: HttpServletResponse, chain: FilterChain) {
//add logic to compute the tags
additionalTags.set(Tags.of("app", "bob"))
chain.doFilter(req, resp)
additionalTags.remove()
}

override fun map(id: Meter.Id): Meter.Id {
return if (id.name.startsWith("http")) {
val moreTags = additionalTags.get()
id.withTags(moreTags)
} else id
}
}

关于multithreading - 多个线程调用同一函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60504159/

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