multithreading - 多个线程调用相同函数的问题
问题描述
我在我的代码中有两次对应用程序的休息调用,即使调用是对同一个端点,我想区分以微米为单位的调用。为此,我正在尝试添加一个新字段,如下所示
@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 的值在两个调用之间被覆盖。我怎样才能避免它?
解决方案
如果它基于进行调用的线程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
}
}
推荐阅读
- c++ - 如何在 C++ 中导出返回类型为 std::map 的函数
- android - 燃料得到身体对错误的反应
- c# - 在 asp.net 中创建动态控件并保留其状态
- python - 如何通过硒和python找到相对于另一个元素的元素
- java - Jdbc 返回空列表但 SQL 查询成功获取数据 [Spring]
- ruby-on-rails - 将哈希内部数组转换为 ruby 中的单键多值哈希
- laravel - 中间件中设置的变量在资源控制器的构造函数中为空,但在控制器的其他方法中具有值(非空)
- google-apps-script - 我可以使用谷歌脚本从搜索栏谷歌驱动器搜索和获取文件吗
- sql - 获取过去 24 小时内每小时的记录数
- javascript - innerHtml +花括号的角度5问题