当前位置: 首页 > 知识库问答 >
问题:

项目Reactor调度器使用旧的threadlocal值是弹性的

龙欣德
2023-03-14

我正在使用spring webflux通过Schudters.elastic()从另一个服务调用另一个服务。

Mono<Integer> anaNotificationCountObservable = wrapWithRetryForFlux(wrapWithTimeoutForFlux(
                notificationServiceMediatorFlux.getANANotificationCountForUser(userId).subscribeOn(reactor.core.scheduler.Schedulers.elastic())
        )).onErrorReturn(0);

在主线程中,我设置了一个InhertitableThreadlocal变量,在子线程中,我试图访问它,它工作正常。

这是我的线程本地存储类

@Component
public class RequestCorrelation {

    public static final String CORRELATION_ID = "correlation-id";

    private InheritableThreadLocal<String> id = new InheritableThreadLocal<>();

    public String getId() { 
       return id.get(); 
    }

    public void setId(final String correlationId) { 
       id.set(correlationId); 
    }

    public void removeCorrelationId() {
       id.remove();
    }
}

现在的问题是它第一次工作正常,这意味着我在threadlocal中设置的值被传递给了其他服务。

但第二次,它也使用了旧id(在上次请求中生成)。

我尝试使用Schedulers.newSingle()而不是弹性(),那么它的工作正常。所以想想既然弹性()是重用线程,这就是为什么它不能清除/或它是重用的。

我应该如何解决问题。我在我的过滤器中设置线程本地,并在我的文件中清除相同的内容

requestCorrelation.setId(UUID.randomUUID().toString());
chain.doFilter(req,res)
requestCorrelation.removeCorrelationId();

共有1个答案

曹建华
2023-03-14

在利用反应器管道时,切勿将资源或信息绑定到特定线程。Reactor本身是调度不可知的;使用您的库的开发人员可以选择在另一个调度程序上安排工作 - 如果您决定强制使用调度模型,则可能会失去性能优势。

相反,您可以在Reactor上下文中存储数据。这是一个类似地图的结构,与订阅者相关联,独立于调度安排。

这就是spring security和micrometer等项目存储通常属于本地线程的信息的方式。

 类似资料:
  • Project Reactor很棒,我可以很容易地切换一个线程来处理另一个线程上的某些部分,但我已经查看了schedulers.fromExecutorService()方法,该方法每次都会分配新的ExecutorService。因此,当调用此方法时,总是会创建调度器并再次分配调度器。我不确定,但我认为这可能会导致内存泄漏... 我想知道如何将调度器注册为bean,它单例所以只会分配一次,而不是每

  • 问题内容: 我有一个容器用。它有一个孩子。 我怎样才能使孩子显得“内联”? 具体来说,如何使孩子的宽度取决于其内容,而不扩展到父母的宽度? 我试过的 我将孩子设置为,但仍然占用了整个宽度。我还尝试了所有其他显示属性,但没有任何效果。 例: 问题答案: 使用的容器上,或在柔性的项目。 不需要。 flex容器的初始设置为。这意味着柔性物品将沿横轴扩展以覆盖容器的整个长度。 该属性的作用与之相同,除了适

  • 我有一个容器 ,其中 。它有一个子 。 怎样才能让孩子显得“内联”呢? 具体地说,我如何使孩子的宽度由它的内容决定,而不是扩展到父母的宽度? 我所尝试的: 我将子项设置为,但它仍然占用了整个宽度。我也尝试了所有其他显示属性,但都没有效果。 示例: null null http://codepen.io/donpinkus/pen/ygrxry 共2个答案 匿名用户 在容器上使用或在弹性项上使用。

  • 如果我调整窗口的大小小于最小宽度flex项目的总数(此处为653px),则会出现一个滚动条,但flexbox采用当前窗口的大小,并且flex项目没有红色背景,我想知道如何在不键入以下特定值的情况下为flexbox容器设置最小宽度: 我不希望收缩flex项目,但一个css的方式来获得: flexbox.min(flex_items_min_width) https://codepen.io/papa

  • 问题内容: 如果您看下面的示例,我希望标头()在父容器内具有相同的长度。 但是我并没有成功实现这一目标。 任何帮助表示赞赏。 问题答案: 弹性盒法 为了使文本项()的宽度相等,您需要使用已完成的。这和说的一样。 但是,由于两个原因,这本身无法实现目标: 默认情况下,flex容器的父级,但更大容器中的flex项,仅限于其内容的宽度。因此它不会扩展,文本可能会溢出容器。你需要申请到,也是如此。 默认情

  • 问题内容: 我想展示水平系列的未知数量的纸牌。为此,如果太多,它们将必须重叠。我很难说服伸缩盒在不缩小卡片的情况下重叠卡片。下面的示例缩小卡片。我尝试过,但后来没有受到尊重。 问题答案: 这就是我使用flexbox做到的方式。 请注意,从技术上讲,卡并不是重叠的,它们只是被剪裁了。但是它们 看起来 像是重叠的。诀窍是将每张卡包裹在另一个带有溢出的元素中:隐藏。 包装元素将缩小以适应可用空间,并且在