GoogleWebToolkitとJavaGoogleAppEngineを使用してアプリを作成しています。私は次のことが非常に予想通りに起こる状況を見つけました。app.yamlエントリのサーブレットがあります。これは次のようになります。
handlers:
- url: /foo/*
name: FooServlet
servlet: com.waga.server.FooServlet
login: required
このサーブレットは、ユーザーがログインしていることを確認し(冗長、私は知っています)、データベースでユーザーを探します。見つかった場合は、GWTモジュールをロードするためのjavascriptを含むHTMLページをレンダリングするためのBar.jspファイルが含まれます。このBar.jspファイルとGWTモジュールはしばらくの間機能しており、サーブレットがBar.jspをレンダリングする前にチェックできるようにするための最近のマイナーな変更と、Bar.jspファイルの先頭に追加されたコードがあります。ページに含めるいくつかの文字列を計算します。
log.infoをサーブレットの上部、Bar.jspファイルの上部、およびBar.jspファイルの下部に配置しました。GWT devmodeを使用してサーブレットに移動すると、ログメッセージが次の順序で表示されます。
Foo servlet top
Bar.jsp top
Bar.jsp bottom
Foo servlet top
Foo servlet top
Bar.jsp top
Bar.jsp bottom
Bar.jsp top
Bar.jsp bottom
つまり、サーブレットはブラウザによって3回アクセスされており、同期していないようです(最後の2つは重複していることに注意してください)。これは私がそれを実行するたびに起こります。
さらに、Bar.jspファイルにはページがレンダリングされていると記載されていますが、GWTjavascriptがクライアント側アプリを読み込んでレンダリングすることはありません。過去にあったので、それはうまくいくはずです。つまり、GWTクライアント側のコードが機能していて、URLをサーブレットにマップする方法とサーブレットに.jspファイルを含める方法を再調整しているところです。さらに、devmodeがクライアントに送信する前にサーバー上でJavaをJavaScriptにコンパイルしているとき、ラップトップファンが起動し、これを行うためにJavaがCPUの大部分をかなりの数秒間使用しているのを見ることができます。今はわかりません。
サーブレットを削除して、app.yamlに.jspを直接呼び出させてみました(すでにログインしているなど、サーブレットがチェックするすべてのパスがパスするので、何も実行されません)。つまり、試してみました。 app.yamlに次のように言わせます:
handlers:
- url: /foo/*
jsp: Bar.jsp
login: required
今、ログはこれを言います
Bar.jsp top
Bar.jsp botton
Bar.jsp top
Bar.jsp top
Bar.jsp bottom
Bar.jsp bottom
GWTモジュールがロードされていないように見えるのと同じインターリーブと同じ症状。