2

サーバー側が遅すぎる場合は、例外をスローして意味のあるエラー メッセージをクライアントに送り返すという態度を取りたいと思います。この制限時間は任意に 5 秒に設定しており、必要に応じて微調整します。

App Engine にはApiProxy.getCurrentEnvironment().getRemainingMillis()、a がスローされてタイムアウトになるまでの残りのミリ秒数が示されていることがDeadlineExceedExceptionわかります。

私は似たようなことをしたいと思っていますが、GAE の 60 秒の制限よりも独自の 5 秒の制限を課しています (繰り返しますが、今のところ、5 秒と 40 秒のどちらを選択しても、それらがより厳しいものであれば問題ありません) GAE が課すものよりも)。5 秒のタイマーを開始するサーバー側のハンドラー/サーブレットを作成したいと思います。リクエストがその時間内に返されない場合、例外がスローされ、クライアントに返されます。

public class MyTimedServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
        // Start 5-second timer
        Timer timer = new Timer(5000);

        try {
            timer.start();
            response = handleRequest(request);
        }
        catch(TimeException timerException) {
            response = ResponseFactory.newTimeExceededResponse();
        }
    }
}

Timer残念ながら、探しているオブジェクトに似たものは GAE API にありません。

を介してすべてのリクエストをマルチスレッド化することをすでに計画しているので、絶対に必要でない限り、バックグラウンドの「タイマースレッドThreadManager.currentRequestThreadFactory().newRequestThread(...)」を作成するためにこれらのスレッドの1つを無駄にしたくありません(一度に10個しか取得できません!)。

だから私は尋ねます: GAE は箱から出してすぐにこのようなものを持っていますか? また、自分でロールバックする必要がある場合、どうすればそれを行うことができますか? 前もって感謝します!

4

1 に答える 1

1

コード内の非同期タスク (通常のフローに従わない) には、新しいスレッドの実行が含まれます。この場合、このタスクは時間をカウントするためのものです。

ただし、App-Engine JRE ホワイト リストに含まれているクラスTimerとその両方を使用できます。TimerTask

コード例: テストされていません。ガイドのみです。

public class YourServlet extends HttpServlet {

    Timer timer;
    HttpServletResponse response;   

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)...{
        int seconds = 5;
        timer = new Timer();
        timer.schedule(new DeadLine(), seconds * 1000);     

        /* the rest of your code here */
    }

    class DeadLine extends TimerTask {
        public void run() {      
            response.getWriter().print("Error: deadline reached.");     
        }
      }
}

詳細については、Java でのジョブ スケジューリングに関するこの記事を参照してください。

于 2012-11-12T23:35:38.167 に答える