1

私は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;
    }
}

何か案は?

4

1 に答える 1

2

コンストラクターでセッションを取得し、インスタンス変数に保存します。SessionオブジェクトとRequestオブジェクトはスレッドにバインドされており、元のリクエストを処理したスレッドとは異なるスレッドでランナブルを実行すると、それらにアクセスできなくなります。

于 2012-10-16T09:42:20.170 に答える