2

新しいSpring 3.2非同期サーブレットリクエストを使用しています。この1つのシナリオを除いて、すべてうまくいきます...

@RequestMapping("/test")
@ResponseBody
public DeferredResult<byte[]> test(InputStream is, HttpServletResponse response, WebRequest request) {
    if (someTest()) {
        deferredResult.setResult(DATA);
        return deferredResult;
    }

    deferredResult.onTimeout(new Runnable() {

        @Override
        public void run() {
            deferredResult.setResult(DATA);
        }
    });

    // Use deferredResult in another thread when needed

    return deferredResult;
}

真の春/トムキャットが404を返すのはいつsomeTest()ですか。これについてどうすればよいのか、なぜこれが起こるのかわかりませんか? Servlet Async Context がすでに作成されているためだと思います。これはバグですか、それとも何か間違っていますか?

どんな情報でも大歓迎です!

4

3 に答える 3

0

return deferredResultif 条件からステートメントを削除する必要があると思います。

また、return ステートメントの後に setData を実行する必要があります。そのため、サーバー側のイベントで別のスレッドからそれを行う必要があります。

これがお役に立てば幸いです。

于 2013-02-06T17:17:27.277 に答える
0

私はそれを理解しました、以下を参照してください...

@RequestMapping("/test")
@ResponseBody
public DeferredResult<byte[]> test(InputStream is, HttpServletResponse response, WebRequest request) {
    if (someTest()) {
        response.getOutputStream().write(DATA);
        return null;
    }

    deferredResult.onTimeout(new Runnable() {

        @Override
        public void run() {
            deferredResult.setResult(DATA);
        }
    });

    // Use deferredResult in another thread when needed

    return deferredResult;
}

トリックは、null を返し、レスポンスを手動で ServletResponse に書き込むことです。

これが他の誰かに使用されることを願っています:)

于 2013-02-06T19:37:13.667 に答える