The Java Servlet Environmentの翻訳

ついでに訳してみた。
原文:http://code.google.com/intl/ja-JP/appengine/docs/java/runtime.html

      1. +

App Engineは安全なSandBox環境でJava6を使ったJava Webアプリケーションを実行します。
App Engineはリクエストを処理し、レスポンスを返すためにアプリケーションのServletクラスを実行します。

Selecting the Java API Version

使用しているSDKAPIバージョンはWEB-INF/libにあるappengine-api-*.jarというjarによって表現されます。
もちろん、新しいjarを再配置するまでは、前のバージョンを使い続けることもできます。
※2009年7月現在で最新にアップデートすると「appengine-api-1.0-sdk-1.2.2.jar」という名前です。
※GAEアプリケーションを新規に作成する時に、以下のようにバージョンを選択できるようになります。

Requests and Servlets

App EngineはWEBリクエストを受け取ったら、デプロイメントディスクリプタの設定にしたがってservletを実行します。
App Engineはアプリケーションを実行するのに複数のWEBサーバーを使用します。サーバーの数は自動的に調整されるため、同じユーザーからのリクエストであっても前のリクエストを処理したサーバーと同じとは限りません。

Response

レスポンス送出時のストリーミングデータはサポートされていません。
クライアントがgzipなどの圧縮されたコンポーネントを受け取ることが出来るということが書かれたHTTPヘッダを送信してきた場合、App Engineは自動的にレスポンスデータを圧縮します。

The Request Timer

リクエストハンドラは30秒で処理しなければならないという制限があります。
30秒に達した場合はcom.google.apphosting.api.DeadlineExceededExceptionをスローすることで、リクエストハンドラの処理を中断します。もしこの例外をcatchしていない場合は、500エラーをクライアントに返します。
さすがに例外をcatchして独自のレスポンスを返す程度のちょっとの時間くらいは与えますよ。といっても1秒程度ですが。


While a request can take as long as 30 seconds to respond, App Engine is optimized for applications with short-lived requests, typically those that take a few hundred milliseconds. An efficient app responds quickly for the majority of requests. An app that doesn't will not scale well with App Engine's infrastructure.
※この訳が分からなかった。というか「short-lived request」が何を指しているかよく分からなかった。

Sandbox

複数のWEBサーバー間でHTTPリクエストを振り分けることを許すために、またアプリケーションが他からの干渉を防ぐために、アプリケーションは厳格な「サンドボックス」な環境で実行されます。
サンドボックスの意味は、以下を参照。
http://e-words.jp/w/E382B5E383B3E38389E3839CE38383E382AFE382B9.html


GAEアプリケーションが出来ないこと:

  • ファイルシステムへの書き込み
    • App Engineデータストアに書き込んでください。
    • ファイルの読み込みはOKです。
  • ソケットのオープンや他のホストへの直アクセス
    • App Engine URLフェッチサービスを使ってください。
  • サブプロセスやスレッドの生成
    • WEBリクエストは2・3秒以内のシングルプロセスで処理されなければならない。
    • 長い時間かかる処理はWEBサーバーの過負荷を避けるために終了させられます。
  • システムコール


Threads
ThreadGroupやThreadを新たに生成することは出来ません。つまり、ThreadPoolExecutorやTimerといったThreadを利用するクラスも使えないので注意してください。
ただし、現在のスレッドに対するメソッドは実行できます。


Filesystem
FileWriterのようなファイルシステムへの書き込みを行うクラスは利用できません。
ただし、FileReaderのようなクラスを使った読み込みは可能です。Class.getResource()やServletContext.getResource()のようなリソースとしてのアクセスも可能です。


java.lang.System
いくつかのメソッドが利用できなくなっています。

  • exit(), gc(), runFinalization(), runFinalizersOnExit()

いくつかのメソッドはnullを返します。

  • inheritedChannel(), console()

ネイティブなJNIコードは実行できなかったり、そもそも提供されてなかったりします。以下は実行するとjava.lang.SecurityExceptionが起こるメソッド一覧。

  • load(), loadLibrary(), setSecurityManager()


Reflection
アプリケーションのクラスに対しては、AccessibleObject.setAccessible()を使うことでプライベートなメメンバーへの読み込みや書き込みが出来ます。
java.lang.StringなどのJRE、javax.servlet.http.HttpServletRequestのようなAPIクラスに対してもリフレクションを使うことが出来ます。ただし、その場合はprivateやprotectedなものには実行できず、publicなメンバーへのアクセスに限定されます。
アプリケーションに属さない他のクラスにはリフレクションを実行することは出来ません。
An application cannot reflect against any other classes not belonging to itself, and it can not use the setAccessible() method to circumvent these restrictions.


Custom Class Loading
完全にサポートしています。
AppEngineはアプリケーションによってロードされた全てのクラスに対して同じ権限を割り当てるために、全てのクラスローダーをオーバーライドします。
Custom class loading is fully supported under App Engine. Please be aware, though, that App Engine overrides all ClassLoaders to assign the same permissions to all classes loaded by your application. If you perform custom class loading, be cautious when loading untrusted third-party code.

JRE White List

JREのいくつかのクラスは利用できないように制限されています。詳しくは以下参照。
http://code.google.com/intl/ja-JP/appengine/docs/java/jrewhitelist.html

Logging

java.util.logging.Loggerを使ってログを出力することが出来ます。
管理コンソール上でログを確認できます。また、ダウンロードすることも出来ます(詳細は以下)。
http://code.google.com/intl/ja-JP/appengine/docs/java/tools/uploadinganapp.html#Downloading_Logs

System.outやSystem.errへの書き込みは全てAppEngineによってキャプチャされ、アプリケーションログに記録されます。
System.outはINFOレベル、System.errはWARNINGレベルです。
log4jのようなログフレームワークもまた利用可能です。しかしながら、java.util.logginアダプタを使うことで、管理コンソールのログレベルの表示をよりよく管理できます。
※プログラム例あり


logging.propertiesを、WEB-INF/classesもしくはWARの中にコピーしてください。次に、appengine-web.xmlのsystem-propertiesに設定を追加してください。
※設定例あり

The Environment

システムプロパティーや環境変数JVM全体ではなく、あなたのアプリケーションにのみ適用されます。
それらはデプロイメントディスクリプタhttp://code.google.com/intl/ja-JP/appengine/docs/java/config/webxml.html)に設定することが出来ます。
アプリケーションサーバー上のJVMを初期化するときに、以下のシステムプロパティーが設定されます。

  • file.separator
  • path.separator
  • line.separator
  • java.version
  • java.vendor
  • java.vendor.url
  • java.class.version
  • java.specification.version
  • java.specification.vendor
  • java.specification.name
  • java.vm.vendor
  • java.vm.name
  • java.vm.specification.version
  • java.vm.specification.vendor
  • java.vm.specification.name
  • user.dir

Quotas and Limits(割り当てと制限)

Limit Amount
リクエストサイズ 10MB
レスポンスサイズ 10MB
リクエスト継続時間 30秒
同時接続数(simultaneous dynamic requests) 30
ファイル総数(アプリケーションファイルと静的ファイル) 3,000
アプリケーションファイルの1つあたりの最大サイズ 10MB
静的ファイルの1つあたりの最大サイズ 10MB
全てのアプリケーションファイルと静的ファイルのサイズ総数 150MB


同時接続数30について
アプリケーションは、同時に、約30のリクエストを処理できます。 これはサーバーサイドの平均リクエスト処理時間が75ミリ秒であるアプリケーションの場合、1秒に400リクエストを処理できることを意味しています。ただし、CPUに負荷をかける重い処理をするアプリケーションは、同一サーバー上で共有している他のアプリケーションにリソースを割り当てるために、待ち時間が発生するかもしれません。
なお、静的ファイルに対するリクエストはこの「30」には含まれません。