如何在多线程线程中传递上下文

问题描述 投票:1回答:1

我们使用多线程并且需要每个子线程中的调用线程的上下文。我们正在使用Spring 4.3。

例如:

final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

CompletableFuture.supplyAsync(() -> {
    ...
    try {
        // take the security context from the caller
        SecurityContextHolder.getContext().setAuthentication(authentication);
        doOperations()

这种方法适用于安全上下文。它从调用者线程(休眠端点)传递,并将其传递给每个创建的可完成的未来。

在调用链中的给定类中,我遵循以下构造:

@Context
protected ProvisioningContext provisioningContext;  
@Context
protected UriInfo uriInfo;

如何在新创建的线程中正确传递所有上下文?

ThreadContext.getContext()这样的方法不起作用。

java multithreading jax-rs
1个回答
0
投票

您可以尝试实现类似于我在此描述的内容

Customize/Extend Spring's @Async support for shiro

那是:

  • 使用Spring的@Async批注在不同的线程中执行任务
  • 实现一个自定义ThreadPoolTaskExecutor,它将当前上下文与要执行的任务相关联
  • 通过实现AsyncConfigurer让spring使用这个任务执行器

如果你想使用像CompletableFuture.supplyAsync或本地执行器服务这样的东西,那么与上面概述的方法相比,你将会得到许多重复的代码 - 使用由spring管理的线程池。

特别是对于像身份验证上下文这样的事情,重要的是要注意从线程中删除上下文。否则,如果线程被回收,则上下文可能仍然附加到线程,作为执行另一个任务的执行程序服务。

© www.soinside.com 2019 - 2024. All rights reserved.