0

私は単純な Java HTTP サーバーを作成しようとしています (まあ、私も))) ですが、スレッド プールと TCP セッションを制御する必要があります。起動時に必要なすべてのスレッドを事前に作成したいのですが、HTTP ハンドラーから TCP セッションを閉じる必要もあります。

まずはJettyを埋め込んでみました。Jetty 8 Server クラスにはsetThreadPoolメソッドがありますが、その ThreadPool は標準よりも強力ではありません (たとえば、Jetty のThreadPoolExecutorにはprestartAllCoreThreadsがありません(そして Java のThreadPoolExecutorを使用できませんか?)。

しかし、サーブレットハンドラーからTCPセッションを閉じることができるようです

HttpSession session = request.getSession();
session.invalidate(); 

しかし、Jetty 9サーバーにはsetThreadPoolメソッドがまったくありません。別の場所に移動しましたか?

次に、 com.sun.net.httpserver.HttpServerを使用しようとしました。スレッドプールでうまく機能します

ThreadPoolExecutor thp = (ThreadPoolExecutor) Executors.newCachedThreadPool();

thp.setMaximumPoolSize(1000);
thp.setCorePoolSize(1000);
thp.prestartAllCoreThreads();

server.setExecutor(thp);

ただし、TCP 接続のクローズを制御することはできません ( HttpExchangeクラスはメソッドを提供しません)。

実際には、Sun HttpServer のスレッド制御と Jetty のセッション制御を組み合わせる必要がありますか?

Jetty 9 で ThreadPool を制御するのも良いでしょう。

また、可能であれば、Jetty などのサードパーティ コンポーネントを使用しないことをお勧めします。

ありがとう。

4

2 に答える 2

1

jetty-9 では、サーバーがどのように配線されているかについて、署名の多くが変更されました。すべてのゲッターとセッターを持っているため、よりコンストラクターベースに切り替えられたため、そこでスレッドプールを渡す機能を見つける必要があります。スレッドの事前開始に関しては、RT/Jetty の下の bugs.eclipse.org でその機能のバグを開いてください。確認します。

また、git には jetty-9 用の jetty-http-spi 実装がありますが、そのアーティファクトは公開していません。私たちは 7 と 8 のためにそれらを持っています。私たちは、それが表示される要求に基づいて、桟橋 9 のために維持する価値があるかどうかを判断しようとしています. そこにあるクラスは、上記のcom.sun httpサーバーを拡張し、内部にバンドルされているものの代わりにjettyを使用できるようにするため、これは別の潜在的なオプションですが、スレッドプールのスレッド開始の問題はまだあります一見すると、特に解決が難しい問題とは思えません。

于 2013-04-30T14:03:50.997 に答える
0

1) Jetty でスレッド プールを調整する方法を見つけました。

Server server = new Server(80);
QueuedThreadPool p = (QueuedThreadPool) server.getThreadPool();
p.setMaxThreads(1012);

2) また、Jetty と com.sun.http Jettyの両方で TCP セッションを制御することも可能 です:ヘッダーを追加するだけですConnection:応答の近くに、Jetty はこのヘッダーを追加して FIN パケットを送信します

response.setHeader("Connection", "close");
response.getWriter().println(str);

しかし、 Tansfer-Encoding: chunkedでは機能しません。バグだと思います。

com.sun.http : も使用

t.getRequestHeaders().add("Connection", "Close");

しかし、それはまったく異なる動作をします - 応答にヘッダーを追加しませんが、すぐに TCP セッションを閉じるので、データを送信した後に使用します:

OutputStream os = t.getResponseBody();
os.write(str.getBytes());
t.getRequestHeaders().add("Connection", "Close");
于 2013-05-01T06:49:20.663 に答える