0

我需要实现通用的 RequestScope,它不仅适用于 http 请求,适用于 http 请求。将其视为应用程序任意入口点的通用 RequestScope。Webservice、kafka、rest、JMS 等等。Tbh 我真的很惊讶,这并不以现成的方式存在。可悲的是,即使经过大量阅读,我也没有从任何地方得到任何答案,我可能缺乏一些基本的弹簧知识。

这个任务原则上是微不足道的。由于请求处理(在考虑的情况下)与单线程有关,我们需要做的就是使用 ThreadLocal,并有一些地方放置初始化和销毁​​逻辑。但我完全在努力寻找任何非极其简单的示例/文档如何在春季执行此操作。有人可以参考我的任何来源或提供示例吗?

但要启动一些解决方案。我想说一个名为“线程”的范围,并且能够使用这个范围注入服务。本质上,我只想在此服务上调用一个方法来获取有关“条目”的信息,对于相同的“条目”,这应该保持不变。好的,让我们创建和注册名为“线程”的自定义范围:

@Bean
public CustomScopeConfigurer customScope () {
    CustomScopeConfigurer configurer = new CustomScopeConfigurer ();
    configurer.addScope("thread", new SimpleThreadScope());
    return configurer;
}

以免将其用于我们的服务:

@Slf4j
@Service
@Scope(scopeName = "thread", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ThreadScopedSomething {
    //....

SimpleThreadScope不支持 bean 销毁,所以我们可以使用 [1] 或 [2],由于某种原因未包含在 spring 中(票证中未记录,他们只是引用了 javadoc)。但是我们的用例不需要任何销毁逻辑,所以我们可以这样做,因为 ThreadScopedSomething 中保存的最小状态将被覆盖。好的,所以这会为每个线程创建 bean,通常在线程池中,所以在一段时间之后,我们将为每个线程创建 bean,它会停在那里。所以我们需要为每个入口点添加一些逻辑来执行初始化/销毁逻辑。休息,所有消息传递等。让我们讨论休息,说卡夫卡似乎更容易做到。我看到提到,这很容易做到@ControllerAdvice,但没有提及如何,所有文档/示例都围绕日志记录,没有建议如何将其应用于更通用的用例。所以我只能想出WebMvcConfigurer

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {

并覆盖preHandle并且afterCompletion将在自动装配的线程范围实例上调用init和。每个入口点都必须这样做。resetThreadScopedSomething

似乎正在工作。看起来丑陋和骇人听闻的方法。有人可以批评提供更好的解决方案/方法吗?这是如何正确完成的?

[1] https://github.com/jyore/spring-scopes [2] https://github.com/devbury/spring-boot-starter-threadscope

4

0 回答 0