gpt4 book ai didi

Java/ Spring MVC : provide request context to child threads

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:26 24 4
gpt4 key购买 nike

我有一个问题,我想将我的 Spring WebMVC 应用程序的一些进程外包到单独的线程中。这很简单并且有效,直到我想使用一个类 userRightService,它使用全局请求。这在线程中不可用,我们遇到了一个问题,这很容易理解。

这是我的错误:

java.lang.RuntimeException:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'scopedTarget.userRightsService': Scope 'request' is not active
for the current thread; consider defining a scoped proxy for this bean if
you intend to refer to it from a singleton; nested exception is
java.lang.IllegalStateException: Cannot ask for request attribute -
request is not active anymore!

好了,够清楚了。我试图通过实现此解决方案来保持请求上下文:

How to enable request scope in async task executor

这是我的可运行类:

@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class myThread implements Runnable {

private RequestAttributes context;

public DataExportThread(RequestAttributes context) {
this.context = context;
}

public void run() {
RequestContextHolder.setRequestAttributes(context);

这是它产生的地方:

final DataExportThread dataExportThread = 
new myThread(RequestContextHolder.currentRequestAttributes());

final Thread thread = new Thread(myThread);
thread.setUncaughtExceptionHandler((t, e) -> {...});
thread.start();

据我所知,我们将 currentRequestAttributes 存储在线程中,然后在运行时恢复它们 currentRequestAttributes...对我来说听起来不错,但错误仍然存​​在。我想我在为我的案例调整解决方案时犯了一些错误。也许有人可以帮我找出错误。

在我经历了很多不同解决方案的 stackoverflow 线程之前(见下文),所以我接下来可以尝试别的东西,但这个对我来说似乎是最清晰和最简单的,所以我希望有人能帮助我找到错误在实现中或解释为什么这是错误的方法。

我已经尝试过这个但没有成功:

如果重要的话:

<org.springframework-version>4.3.4.RELEASE</org.springframework-version>

顺便说一句:我知道以某种方式重构应用程序会更好,线程中不需要请求,但在那种情况下这非常复杂,我真的希望我能避免这种情况。

--

编辑1:

不能在线程中创建的Bean是这样启动的:

@Service("userRightsService")
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserRightsService {

--

编辑2:

这个我也试过:

但是上下文总是空的...

最佳答案

我无法重现该问题,因为我不确定您是如何创建/注入(inject) UserRightsService 的,但我有一些建议您可以尝试。

我想问题是 RequestAttributes 在请求结束时无效(这就是为什么异常显示 Cannot ask for request attribute -
request is not active anymore
),这在您的任务运行时发生。

相反,您可以尝试在生成线程的地方注入(inject) UserRightsService 并将此实例作为参数传递给线程。这样,UserRightsService 应该可以毫无问题地创建,因为请求仍然可用。

即便如此,在请求结束后尝试访问 RequestAttributes 也可能会失败。在这种情况下,我建议在请求结束之前(即在运行线程之前)复制您需要的所有值。

如果这对您不起作用,请提供更多有关如何在任务中初始化 UserRightsService 的信息。

祝你好运!

P.S.:我认为你的线程类中的范围注解是无用的,因为任务对象是手动创建的,而不是由 spring 管理的。

关于Java/ Spring MVC : provide request context to child threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52502666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com