在以下线程中访问作用域代理Bean

我有一个在tomcat中运行的Web应用程序,其中使用ThreadPool(Java 5 ExecutorService)并行运行IO密集型操作以提高性能。我希望在每个合并线程中使用的某些bean在请求范围内,但是ThreadPool中的Threads无法访问spring上下文并导致代理失败。关于如何使Spring上下文可用于ThreadPool中的线程来解决代理故障的任何想法?

我猜测必须有一种方法可以用spring为每个任务在ThreadPool中注册/注销每个线程,但是没有运气找到如何做到这一点。

谢谢!

回答:

我将以下超类用于需要访问请求范围的任务。基本上,你可以扩展它并在onRun()方法中实现你的逻辑。

import org.springframework.web.context.request.RequestAttributes;

import org.springframework.web.context.request.RequestContextHolder;

/**

* @author Eugene Kuleshov

*/

public abstract class RequestAwareRunnable implements Runnable {

private final RequestAttributes requestAttributes;

private Thread thread;

public RequestAwareRunnable() {

this.requestAttributes = RequestContextHolder.getRequestAttributes();

this.thread = Thread.currentThread();

}

public void run() {

try {

RequestContextHolder.setRequestAttributes(requestAttributes);

onRun();

} finally {

if (Thread.currentThread() != thread) {

RequestContextHolder.resetRequestAttributes();

}

thread = null;

}

}

protected abstract void onRun();

}

以上是 在以下线程中访问作用域代理Bean 的全部内容, 来源链接: utcz.com/qa/399362.html

回到顶部