2011-01-03 10 views
28

サーブレットコンテナ(Tomcatなど)で動作する小さなJava Webアプリケーションをビルドすると、Webサーバーが組み込まれて実行されているスタンドアロンJavaアプリケーションを構築する利点は何ですかそれはリバースプロキシの背後にある?サーブレットコンテナ内のJava Webアプリケーションとスタンドアロン

私はJavaで約1年間プレイしてきました。私はTomcatを起動するのに時間がかかることに気付きました。クラスローダーの問題のためにホットリデプロイを行うことは必ずしも可能ではありません。サーブレットAPIは、特に構成やRESTfulな設計(実際には完全にサポートされていない)の観点から、やや複雑なものです。

一方、私のIDEは、スタンドアロンのアプリケーションをコンパイルして驚くほど高速に実行できることに気付きました。逆プロキシのためのApacheの設定はケーキの一部です。埋め込まれたJettyは、私がそれを投げることができるものは何でも処理するようです。私はRestlet、Wicketなどを使うことができるときにサーブレットは必要ありません。アプリケーションの仕組みを知ることができれば(巨大なアプリケーションサーバーと統合されていないため)、力を入れてくれます。スタックトレースは短くなります。ダウンロードサイズは小さくなります。エンドユーザーの設定は簡単です。私は、関連するソフトウェア層が少なくて済むため、パフォーマンスが向上する可能性が高いと推測しています。

しかし、私は、普通はあまりにも真実であると思われるものが普通だと言っていることを思い出しています。だから私の質問は、なぜ私は自分のWebアプリケーションをスタンドアロンにしたくないのでしょうか?サーブレット・コンテナは、本当に必要な私および/または私のエンド・ユーザーに何を知らせるのですか?

答えて

13

ここでは2つの個別の質問があります:私は組み込み サーバーを使用して、またはコンテナに配備するべき

  1. は?

    大きな違いがあるとは思わないでしょうか。 Jettyサーバーをプログラムで起動するコードが少しあります。構成は で、プログラムで行う方が簡単です。 ウェブアプリ の構成と展開のためのIDEサポートは が良くなっているにもかかわらず、それはまだスタンドアロンアプリケーション ( サポートへの物事のスーパーセットが ありますので、これは、定義によってちょっとある)のためのより に悪いです。

    一方、アプリケーションサーバはなど、組み込みのサービスとして を実行する機能、あなたに ビルトイン 管理などのいくつかの素晴らしい恩恵を与える

    あなたも、ハイブリッド アプローチを使用することができます。埋め込みサーバーを使用して をローカルに開発し、次に運用中の コンテナに展開します。しかし、それは ちょっと変わっています。 適切なWARファイルを作る手間があれば、 IDEは実際に をコンテナ に配置することができます。

    ご存知のとおり、ホット再デプロイメントでは という問題があります。 Tomcatはない あなたはいくつかの奇妙な コーナーケースに実行している ない限り、それに問題がする...

  2. 私はサーブレットAPIを使用する必要がありますでしょうか?

    これは#1と直交しています。 は、Jettyと がサーブレットを実装することができます。 Tomcat の中で Restlet APIをServerServlet http://www.restlet.org/documentation/1.0/faq#02を使って使用することもできます。

    私は個人的にかなりstraight-forward.Youは、同時実行性と 状態管理などの 素敵なものを得ることが にサーブレットAPIを見つけます。私はかなりそれはRESTfulな設計 がサポートされていないことを意味するもの 分かりませんが、Restlets がより良いあなたの要件に対応している場合、 は、それを使用...

0

サーブレットコンテナは、自動セッション管理、ホットデプロイメント、フェールオーバーやクラスタリングのためのフレームワークなど、多くの便利な機能を提供します。もちろんコンテナによって異なりますが、時にはこれらは非常に便利なツールです。時々彼らはそうではありません。

編集:ちょうどホット再デプロイについてのあなたのコメントに気づいた。はい、時々コンテナはバギーで働き、痛みがあります。それらはすべて独自の傾向を持つ傾向があります。それにもかかわらず、時々彼らは本当に良いものを提供しています。

3

組み込みのJettyは、サーブレット・コンテナです。あなたのアプリケーションには、wicketフィルタ/サーブレット、RESTletサーブレット、およびそれらのマッピング(少なくとも)を定義するweb.xmlが含まれていると仮定します。サーブレットAPI(またはサーブレットコンテナを埋め込んだとしても)を取り除くことはできませんが、フレームワークの下や可能な限り、独自のmain()メソッドにも隠すことができます。 RESTlet(またはJerseyやJAX-RS実装)とSpring MVCはすべてサーブレットに基づいているため、サーブレットAPIはRESTを非常にうまくサポートしています。

P.S. 2つのアプローチはお互いを排除しません。開発中にJettyと仕事をして、QA /生産用のコンテナ(埋め込まれていない)に展開することができます。または、それが本当にあなたのニーズに合っているならば、生産のために桟橋をつないでください。

4

埋め込みJettyは、完全なサーブレットスタックを必要としない場合に適しています。 Tomcatとは異なり、Jettyは使用していない部分(JSP、JNDIなど)を簡単に取り除くことができます。

一方、あなた自身のHTTPサーバーを書くことはひどい考えです。もちろん、基本的な要求を扱うものを書くのは簡単です。しかし、まもなく、一部のクライアントは完全なプロトコル仕様をサポートしていないため、問題を抱えていることがわかります。数百人以上のユーザーがいるとクラッシュすることがあります。またはマレーシアのある子供があなたのプリンタを爆破させる脆弱性があることを示しています。だから、ホイールを再発明しないでください。

サーブレットAPIがRESTfulデザインをサポートしていないという苦情については、あなたはその点を見落としていますが、これを行うつもりはありませんでした。しかし、Servlet APIのの上にを実行するRESTライブラリがたくさんあります。

0

インプロセスのサーブレットコンテナは、WebサーバーのJVM内で動作するコンテナです。これらのコンテナは、優れたパフォーマンスを提供しますがスケーラビリティには劣ります。

アウトオブプロセスコンテナは、Webサーバーの外部のJVMで動作するコンテナです。パフォーマンスは劣りますがスケーラビリティは向上します アウトオブプロセスコンテナの場合、Webサーバーとコンテナは、IPCなどの標準的なメカニズムを使用して相互に通信します。

これらのタイプのコンテナに加えて、スタンドアロンサーブレットコンテナである3番目のタイプがあります。これらはWebサーバーの不可欠な部分です。

-1

ホットデプロイメントに問題がある場合は、外部接続やその他のリソースをクリーンアップしていない可能性があります。これを処理するには、通常、何かが開始または停止したときに通知するリスナーを実装する必要があります。あなたはおそらくあなたの戦争でこのような何かを実装する必要があります

(Tomcatの6):Tomcatの

public class MyTomcatInitCleanupListener implements ServletContextListener 
{ 
    @Override 
    public void contextInitialized(ServletContextEvent arg0) 
    { 
     super.contextInitialized(arg0); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) 
    { 
     super.contextDestroyed(arg0); 
    } 
} 

7+、あなたが

の "Tomcatのライフサイクルリスナー" をグーグルことができます
関連する問題