com.sun.HttpServer socket backlog
Asked Answered
E

1

6

What does socket backlog mean?

for example I have web service

@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);
}
}

and webservice client

 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();
}

on the server only 10 working threads and backlog is set to 10, so there can be 10 accepted connections and 10 connections that are waiting in backlog and any other connection will be refused, am I right?

May be not as I don't get ClientTransportException.

Could you give me explanation what is happening with connections and why there is no ClientTransportException.

Emersed answered 18/7, 2011 at 11:30 Comment(0)
C
2

It is a queue of connections that have already been accepted by TCP before you have called accept() to become aware of them in your application. Setting it to a low value like 10 is pretty pointless: TCP will increase that to its own minimum, which might be 50 or 500 depending on the platform, and if it didn't, all it accomplishes is to cause pointless ConnectExceptions. You're better off leaving this value to default.

Chally answered 18/7, 2011 at 12:18 Comment(5)
May be sometimes it's good to limit amount of total waiting connectionsEmersed
@misha nesterenko why? The backlog queue already does that. Where is the virtue in changing the limit?Chally
But that parameter was added for some reason. If it was useless I think it would not be present in methodEmersed
@mishanesterenko I didn't say it was useless, I asked why you want to do it. Not the same thing.Chally
So, when it is useful to change this queue of connections?Apiarian

© 2022 - 2024 — McMap. All rights reserved.