2012-03-12 9 views
0

Tomcat(6)は、server.xml内のExecutor要素内のスレッドプールの定義を許可します。アプリケーションコード内でExecutorServiceのようなスレッドプールを使用できますか?もちろん、私は自分のスレッドプールをServlets/ServletContextListener/Spring/whateverに作成することができますが、デプロイメント記述子にスレッド数などの設定をする方がいいようです。Tomcatに設定されたエグゼキュータをアプリケーションコードで使用しますか?

更新:私のアイデアは、別のエグゼキュータ要素を設定し、このスレッドプールをアプリケーション内でのみ使用しますが、tomcats自身のコンポーネントでは使用しませんでした。この方法ではおそらくTomcat自体に干渉しないでしょう。

答えて

1

あなたの質問には、server.xmlのエグゼキュータ-要素は、(例えばHTTP接続用)ようにコネクタ、スケジューラなどTomcatのコンポーネント、間で共有されているwhitchのThreadPoolを定義

...少しは不明らしいです。自分のタスクをサーバーに追加しないでください。内部のThreadPoolがサーバーの安定性を損なう可能性があり、アプリケーションをTomcat xyにハードワイヤ接続します。

Tomcatはあなたがスレッドのスレッドプールのを所有制御したい場合は、あなたがdevelpomentと異なるコアプールサイズと本番モードのいずれかの1 Tomcatを持っていると言う、あなたはサーバ側でコンテキストパラメータを設定することができますはこれを行うには:server.xmlの

<server> 
    ... 
    <host ...> 

    <Context docBase="MyApp" path="/MyApp" reloadable="true"> 
     <Parameter name="numberOfThreadsOnThisTomcat" value="50"/> 
    </Context> 

    </host> 
</server> 

が値を取得し、使用してアプリで:

詳細情報については
getServletContext().getInitParameter("numberOfThreadsOnThisTomcat") 

はここを見て:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters

このパラメータがautodeployment後に存在しないかもしれないことに注意してください。

Tomcatの動作を完全にプログラムで制御したい場合は、埋め込みTomcatを使用してアプリをスタンドアロンで実行することをおすすめします(例:Liferay Portalなど)。ここをクリックしてください:http://tomcat.apache.org/download-70.cgi#7.0.26

+0

私の考えは、追加のExecutor要素を設定し、それをtomcatsコンポーネントではなく、バックグラウンドタスクを実行するアプリケーション内でのみ使用することでした。そのようにして、アプリケーションはtomcatsの安定性を損なうことはできませんでしたか? –

0

私たちは恐れて、tomcatエグゼキュータを使用しないでください。

実行者と呼ばれています!何か他のものではない。理想的には、ExecutorServiceがCPUコア数で構成されると、すべてのプログラムがすべてのコードが非同期モードの場合、すべてのプログラムが同じExecutorサービスを使用する必要があります。すべてのコードが非同期モードにあるわけではないので、CPUコアに比べてはるかに大きな数を使用してください。とにかく、すべてのコンポーネントがそれぞれのエグゼキュータサービスを使用する必要はありません。

どのくらいの頻度で、デッドループを含むコードを書きますか?

webappから、tomcatなどのサーブレットコンテナで使用されているエグゼキュータにはどうすればアクセスできますか?

カスタムエグゼキュータを指定し、server.xmlのデフォルトのorg.apache.catalina.core.StandardExecutorを置き換える必要があります。このエグゼキュータがカスタマイズされているため、webappsは静的変数でもアクセスできます。

関連する問題