問題タブ [servlet-container]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Tomcat はどのように同じサーブレット コンテナー内で異なるアプリケーションを提供しますか?
私の質問は、ウェブサーバーとサーブレットコンテナーがどのように相互作用するかを理解していることに基づいています。したがって、私の基本的な理解が間違っている場合は修正してください。
入ってくるリクエストを考えてみましょう:
www.bank.com/credit-cards
.Tomcat サーバーはリクエストを受け取るとすぐに、 上記の着信 URI にマップされて
servlet Container
いるに転送します。web.xml
/credit-cards
サーブレット コンテナは、サーブレットをインスタンス化するルーチンを実行します (これが最初の要求の場合)。そうでない場合は、このリクエストの を作成し、それ
Thread
をサーブレットに渡します。サーブレットは、レスポンスの生成を処理します。その後、Tomcat は応答をクライアント ブラウザに返します。で別のリクエストがあるとし
www.bank.com/accounts
ます。これは、同じサーバー内の別のアプリケーションによって提供されます。同じアプリケーション内の別のサーブレットではありません。URL マッピングはどのように保持されますか? サーバーは、どのアプリケーションにリクエストを転送する必要があるかをどのように認識していますか? サーバーは記述子ファイルを保持しません。アプリケーション 1 とアプリケーション 2 には、受信 URL をサーブレットにマップする web.xml ファイルがあります。すべての URL マッピングとサーブレットは、検索のためにサーバーのどこかに登録されますか?
各アプリケーションには独自のコンテナが必要だと思います。つまり、上記の場合、2 つのサーブレット コンテナが存在します。
これは一般的なシナリオですか?サーバーに複数のアプリケーションを保持するサーブレット/JSPが使用されている実際の例を知りません(おそらく、ユーザーは2つのリクエストが同じアプリケーションからのものか異なるアプリケーションからのものかを区別できません)
java - java -jar jenkins.war を使用して、本番環境でサーブレット コンテナなしで Jenkins を実行する必要がありますか
Java および Java Web アプリケーションは初めてです。コマンドラインから実行するのではなく、Tomcat のような Java アプリケーション サーバーを使用する必要がある理由を理解しようとしています。
- 本番環境でサーブレットコンテナなしでJenkinsを実行する必要があります
java -jar jenkins.war
か? - Tomcat は実稼働環境により適していますか?
- 他の利点はありますか?
アプリケーションをサーブレット コンテナで実行することが重要な理由を教えてください。
java - WAR によって共有されるコンテナー レベルのバージョン管理されたライブラリ
Java サーブレット コンテナー (Tomcat が望ましいですが、別のコンテナーで実行できる場合はそう言ってください) では、理論的に可能なものが必要です。ここでの私の質問は、それをサポートするツールが存在するかどうか、存在する場合はどのツール (またはさらに調査する必要がある名前) かです。
これが私の問題です。1 つのサーブレット コンテナで、多数の異なる WAR ファイルを実行したいと考えています。それらはいくつかの大規模な共通ライブラリ (Spring など) を共有しています。一見したところ、受け入れがたい選択肢が 2 つあります。
各 WAR ファイルに大きなライブラリ (Spring など) を含めます。これは、Spring の多数のコピーをロードし、サーバーのメモリを使い果たすため、受け入れられません。
大きなライブラリをコンテナ クラスパスに配置します。これで、すべての WAR ファイルがライブラリの 1 つのインスタンスを共有します (良い)。しかし、すべての WAR ファイルを一度にアップグレードしないと Spring バージョンをアップグレードできないため、これは容認できません。
ただし、理論的には、機能する代替手段があります。
- 大きなライブラリの各バージョンをコンテナ レベルのクラスパスに配置します。各WARファイルが使用したいバージョンを宣言し、クラスパスでそれを見つけるように、コンテナレベルの魔法を行います。
「魔法」はコンテナレベルで実行する必要があります(私はそう思います)。これは、ライブラリの各バージョンを異なるクラスローダーでロードし、各WARファイルに表示されるクラスローダーを調整することによってのみ達成できるためです。
それで、これを行うことについて聞いたことがありますか?もしそうなら、どのように?または、さらに調査できるように、それが何と呼ばれているか教えてください.
java - Quartz Scheduler - Tomcat またはアプリケーション jar で実行するには?
Jersey/Tomcat/Apache/PostgreSQL で実行されている RESTful Web サービスを介して着信データを受信する Web アプリケーションがあります。この Web サービス アプリケーションとは別に、実行する必要がある反復タスクやスケジュール タスクが多数あります。たとえば、さまざまな種類のデータをさまざまな間隔で消去したり、さまざまなスケジュールで外部システムからデータを取得したり、指定した日時にレポートを生成したりします。
したがって、Quartz Scheduler を読んだ後、それが非常に適しているように思えます。
私の質問は、Tomcat で (QuartzInitializerListener を介して) 実行するように Quartz ベースのスケジューリング アプリケーションを設計するか、それとも Linux デーモンとして実行するように (たとえば、Apache Commons Daemon または Tanuk Java Service Wrapper を介して) スタンドアロン アプリケーションに組み込むべきかということです。
一方では、Tomcat を使用して、http 呼び出しの受信を目的としていないアプリケーションをホストすることは直感に反するように思えます。一方、私は Apache Commons Daemon や Java Service Wrapper を使用したことがないので、Tomcat 内で実行するのが最も抵抗の少ない方法かもしれません。
どちらのアプローチにも、知っておくべき重要な利点や危険性はありますか? 私たちのコアモジュールはすでにデータアクセスやロギングなどを処理しているので、どちらにしてもこれらのサービスが大きな要因になるとは思いません。
スケジューリングはデータ駆動型になるため、Quartz ベースのスケジューラーは PostgreSQL から関連データを読み取ります。ただし、Tomcat 内でスケジューリング アプリケーションを実行する場合、Tomcat への http 呼び出しを介してアプリケーションにメッセージを送信することは可能ですか? 最後に、私たちのジョブは既存のアプリケーション データによって駆動されるため、Quartz JDBCJobStore は必要ないと思います。
spring-mvc - REST API を使用した Web サーバー - Spring Boot - 複数のサーブレット コンテナー
私のアーキテクチャでは、Spring を Web サーバーとして使用し、静的な html および javascript ページを提供し、残りの API として使用しています。現在、Spring アプリはポート 8080 でリッスンしています。ポート 80 に簡単に変更できますが、API と Web サーバーは別のポートに配置する必要があり、静的コンテンツを提供するためだけに別のアプリを作成する理由はないと思います。どの春が簡単にできるか。
私はオンラインでいくつかの他の質問を調べましたが、Spring は複数のサーブレット コンテナーを使用して 2 つの異なるポートでリッスンできることがわかりました。複数のアプリケーション コンテキストを作成するだけでよいという質問さえありました。
ただし、特にSpring Bootを使用する場合、少なくとも私にとっては簡単ではありません。
- 複数のポート (80 および 8080) でリッスンするために、複数のサーブレット コンテナーまたは複数のアプリケーション コンテキストを作成するにはどうすればよいですか?
- それらを設定した後、どのサーブレットが何をするかを制御するにはどうすればよいですか? つまり、どちらが静的ページを提供し、どれが残りの API を提供するのでしょうか?
-
編集
次の質問は私自身のものと一致しているようですが、前述のように、特に xml 構成ではなく Spring Boot/Annotations を使用する場合、これを実装する方法がわかりません。
スプリング ブートで複数のサーブレット コンテナ/サーブレットを構成する
編集 (2)
そのようなことの良い使用例は、サイトを SSL 対応にすることですが、必須ではありません。つまり、potr 443 経由で ssl を有効にしながら、ユーザーがポート 80 経由で安全でないアクセスを使用できるようにする必要があります。
編集 (3)
Dave Syer の回答が最適かどうかはわかりませんが、うまくいくようです。彼の方法とは異なり、私はサーブレット コンテナー カスタマイザーを使用してポートを変更していますが、それでも 2 番目のスレッドを使用して 2 番目のスプリング アプリケーションを作成していることに注意してください。
編集(回答)
Dave Syer の元の回答は機能していますが、私が探していたものではありませんでした。彼のコメントの 1 つに記載されているように、Tomcat サーブレット コンテナー (Spring のデフォルト)、または jetty の Handler を使用している場合、答えは 2 番目の Connector オブジェクトを作成することです。
私は次のようなものを使用しました:
java - Spring mvc / Tomcat Servlet Container: マルチスレッドの初期化 (そして誰がそれらを生成するのか?)
私はオンラインで調べようとしましたが、春が実際にマルチスレッドであると言っている場所はほとんど見つかりませんでした。それらでさえ、単にマルチスレッドのサーブレット コンテナーを使用していることを示唆しているようです(私が理解している限り、シングルスレッドのサーブレット コンテナーはほとんど非推奨であるため、最近はすべてマルチスレッドになっています)。
誰かがその情報を明確にして検証できることを望んでいました。マルチスレッドは本当にサーブレットコンテナから来ており、春ではありませんか?
さらに重要な問題は、スレッドごとのデータをどのように初期化するかということです。データベース接続管理の一環として、各スレッドでデータを初期化する必要があるライブラリを使用しています。
現在、そのライブラリへのすべての呼び出しで値をチェックして、初期化することを知っています。しかし、スレッドが開始するたびに単純に初期化することを好みます。
私はそれが可能であるべきだと信じています。結局のところ、誰かが私のスプリング コントローラーを呼び出し続けるスレッドを作成しています。
ps私は、TomcatであるSpringのデフォルトのサーブレットコンテナを使用しています。また、Tomcat でスレッドごとの初期化とマルチスレッド化について簡単な検索を試みましたが、新しいスレッドが実際にいつ生成されるかについての明確な情報や、使用されているスレッド プールに関する情報を見つけることができませんでした。私は間違っているかもしれませんが、マルチスレッドは
java - ServletContainerInitializers の URL [] で見つかった JAR の処理に失敗しました
Tomcat 7 -> Tomcat 8 からサービスをアップグレードしていますが、ちょっと途方に暮れている今、この問題に遭遇しています。
スタック トレースは次のとおりです。
「URL []」と「名前が [{1}] のコンテキスト」全体が見栄えが悪いことはわかっていますが、その理由や、これらの値がどのように設定されたのかはわかりません。何が起こっているのか、誰かが私を正しい方向に向けることができますか?
java - デプロイに依存するパラメーターを webapp に渡す方法
私が取り組んでいるプロジェクトでは、ストレージ パスや DB ログインなどの展開パラメーターは、通常、war ファイルに保存されているパラメーター ファイルを介して指定されます。
これらの値は、webapp が別の展開 (dev と prod、実行コンピューターの変更) 用にパッケージ化されるたびに変更する必要があるため、不適切だと思います。ソースコードがバージョン管理されているため、さらに面倒です。
上記のようなパラメーターを渡すためのより良いオプションはありますか?
より良いとは、つまり:
- 実用的: セットアップ、変更、および他の人への説明が簡単
- 戦争から離れた
- Webコンテナに可能な限り独立しています(依存している場合は、製品でTomcatを使用しています)
編集
私は@aksappyの回答を選択して、回答で行われた作業に報いるとともに、標準ツールを使用したいくつかの方法を提供したためです。ただし、コンテキストに応じて、他のソリューションを使用できます。
- @Necreaux のメソッドは最高のシンプルさを持っています
- @Luiggi Mendoza のメソッドはデザインが良く、シンプルです。
- コードが他のケースをカバーしていれば、@OldCurmudgeon のメソッドは本当に良いものになるでしょう。