私はWebアプリケーション(Springとvaadinを使用)を持っていますが、何らかの作業を行うためにセカンダリスレッドを作成する必要がありました(変更できない既存のコードのため、これを別の方法で行うことはできません)。このスレッドでは、セッションにアクセスする必要があります。私はこの有用な答えを見つけました:
Threads of
Everything 内のスコープ付きプロキシ Bean へのアクセスは問題ありませんが、セッションを取得しようとするとスレッドが開始された後、null になります。私はまだセッションIDを取得しています...
public RequestAwareRunnable() {
this.requestAttributes = RequestContextHolder.getRequestAttributes();
this.thread = Thread.currentThread();
String sessionID = requestAttributes.getSessionId();
HttpSession session = ((ServletRequestAttributes) requestAttributes).getRequest().getSession(false);//the session is OK
}
public void run() {
try {
String sessionID = requestAttributes.getSessionId();
HttpSession session = ((ServletRequestAttributes) requestAttributes).getRequest().getSession(false); // i get null
RequestContextHolder.setRequestAttributes(requestAttributes);
onRun();
} finally {
if (Thread.currentThread() != thread) {
RequestContextHolder.resetRequestAttributes();
}
thread = null;
}
}
何か案は?