Проблема с несколькими потоками, вызывающими одну и ту же функцию

В моем коде дважды вызывается приложение для отдыха, хотя вызов относится к одной и той же конечной точке, я хочу различать вызовы в микрометре. Для этого я пытаюсь добавить новое поле, как показано ниже.

@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 (оба вызова являются асинхронными из одноэлементного компонента). Но, как видно из кода, поскольку создан только один экземпляр класса, значение isRequired переопределяется между двумя вызовами. как я могу этого избежать?


person robin    schedule 03.03.2020    source источник


Ответы (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
    }
}
person checketts    schedule 04.03.2020