1

tomcat7を使用してJavaアプリケーションを実行しています。ThreadLocalsアプローチを使用できるように、Tomcatスレッドごとに情報を保存する必要があります。

私のserver.xmlでは、スレッドプールの定義は次のようになります。

 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
    maxThreads="10000" minSpareThreads="2000"/>

私はクラスEnhanceThreadを持っています

public class EnhanceThread extends Thread {
    ...
    @Override
    public void run() {
       SomeThreadLocals.set(data);
       super.run();
     }
}

Tomcatスレッドプール定義をオーバーライドして、クラスを使用できるようにするにはどうすればよいですか?この問題を脅かすためのより良いアプローチはありますか?

4

2 に答える 2

1

そのためにTomcatスレッドをいじる必要はありません。次のコードを使用するだけです。

public class JsonSerializerFactory {
    private static final ThreadLocal<JsonSerializer> JSON_SERIALIZER = 
        new ThreadLocal<JsonSerializer>() {
            @Override 
            protected JsonSerializer initialValue() {
                 return new JsonSerializer();
            }
        };

    public static JsonSerializer get() {
        return JSON_SERIALIZER;
    }
}

シリアライザーが必要になるたびに、を呼び出すJsonSerializerFactory.get()と、スレッドローカルインスタンスが返され、まだ存在しない場合は遅延して作成されます。

于 2012-05-20T12:36:55.343 に答える
0

Tomcat Executor は java.util.concurrent クラスの上に構築されているため、Tomcat コンポーネント クラスを置き換えることができますが、それは良い考えではないと思います。

リクエスト スコープにデータを配置する必要がある場合は、サーブレット仕様で明確に定義された方法がいくつかあります (例: ServletRequestListener)。また、サーブレット フィルターを使用して、それを必要とする要求のみに選択的に追加することもできます。

于 2012-05-24T19:54:07.003 に答える