6

ソケットバックログとは?

たとえば、私はWebサービスを持っています

@WebService
public class Calculator {
public int sum(int a, int b) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return a + b;
}

public static final int threadCount = 10;

public static void main(String[] args) throws IOException {
    Executor manyThreads = Executors.newFixedThreadPool(threadCount);
    HttpServer server = HttpServer.create(new InetSocketAddress(8989), threadCount);
    server.setExecutor(manyThreads);
    server.start();

    Endpoint ep = Endpoint.create(new Calculator());
    HttpContext context = server.createContext("/calc");
    ep.publish(context);
}
}

および Web サービス クライアント

 public static void main(String[] args) throws IOException {
    CalculatorService service = new CalculatorService();
    final Calculator calc = service.getCalculatorPort();

    Executor executor = Executors.newFixedThreadPool(100);

    for (int i = 0; i < 1000000; ++i) {
        executor.execute(new Runnable() {
            public void run() {
                try {
                    int currentThreads = runningThreads.incrementAndGet();
                    int res = calc.sum(10, 10);
                    System.out.println("Running threads: " + currentThreads + " Result: " + res);
                } catch (ClientTransportException e) {
                    System.out.println("connection refused");
                } finally {
                    runningThreads.decrementAndGet();
                }
            }
        });
    }

    System.in.read();
}

サーバー上では 10 個の作業スレッドのみがあり、バックログは 10 に設定されているため、10 個の受け入れられた接続と 10 個の接続がバックログで待機している可能性があり、他の接続は拒否されます。

私はClientTransportExceptionを取得していないので、そうではないかもしれません。

接続で何が起こっているのか、なぜ ClientTransportException がないのかを説明していただけますか。

4

1 に答える 1

2

accept()これは、アプリケーションでそれらを認識するために呼び出す前に、TCP によって既に受け入れられている接続のキューです。10 のような低い値に設定するのはかなり無意味です。TCP はそれを独自の最小値 (プラットフォームによっては 50 または 500 になる可能性があります) まで増やしConnectExceptions.ます。この値をデフォルトのままにします。

于 2011-07-18T12:18:51.737 に答える