【问题标题】:Issue with Multiple threads calling same function多个线程调用相同函数的问题
【发布时间】:2020-03-03 09:36:54
【问题描述】:

我的代码中有两次对应用程序的休息调用,即使调用是对同一个端点,我想以微米为单位区分调用。为此,我正在尝试添加一个新字段,如下所示

@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(两个调用都是来自单例 bean 的异步)。但正如您从代码中看到的那样,由于只创建了一个类的实例,因此 isRequired 的值在两个调用之间被覆盖。我该如何避免呢?

【问题讨论】:

    标签: multithreading kotlin thread-safety micrometer spring-micrometer


    【解决方案1】:

    如果它是基于线程进行调用,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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多