GAEサーブレットをマルチスレッド化して、同じインスタンス上の同じサーブレットが最大10個(フロントエンドインスタンスでは、の最大スレッド数= 10)の同時リクエスト同時に異なるユーザから、それらの各々の間でタイムスライシングを行う。 GAEの起動時マルチスレッドGAEサーブレットで同時ユーザーを処理する
public class MyServlet implements HttpServlet {
private Executor executor;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
if(executor == null) {
ThreadFactory threadFactory = ThreadManager.currentRequestFactory();
executor = Executors.newCachedThreadPoolthreadFactory);
}
MyResult result = executor.submit(new MyTask(request));
writeResponseAndReturn(response, result);
}
}
だから基本的に、それはこのサーブレットにリクエストを取得する最初の時間は、Executor
を作成して保存されます。新しいサーブレット要求ごとに、そのエグゼキュータを使用して新しいスレッドが生成されます。明らかに、MyTask
の中のすべてはスレッドセーフでなければなりません。
私が心配しているのは、これが本当に私が望んでいることをしているかどうかです。つまり、は、このコードで同時に複数のユーザーからの複数の要求を処理できる非ブロッキングサーブレットを作成します?そうでない場合は、なぜそれを修正するために私は何をする必要がありますか?そして、一般的に、GAEのマエストロが死んだことが間違っていることが分かる何か他のものがありますか?前もって感謝します。
+1 - 私はあなたが問題について考えているやり方と、解決策にアプローチしようとした方法が本当に好きです。しかし、幸いなことにGAEはこのように動作しません。また、 'currentRequestThreadFactory()'メソッドは、その名前の読み方に基づいて期待することはできません。私はうまくいけばメソッド名のあいまいさをクリアして、以下の答えを投稿しました。 (現在のRequestThread-Factoryではなく、currentRequest-Thread-Factoryです); –
好奇心から逃れてください:達成しようとしていることは何ですか?ちょっと前に戻ってきたので、まったく同じ質問に目を通していました。私は、GAEを使って何らかの長いポーリングプッシュ通知を実装することを望んでいましたが、そのようなことであなたのやり方で得られる他の多くの問題があることが判明しました。 GAEは、リクエストをスケジュールして処理する方法を調整できるという点では、かなり制限されています。そして、これらの制限のいくつかはあいまいです...しかし、それはそれがとても速くスケーラブルであることを可能にするものです... –