Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

com.sun.HttpServer socket backlog

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.

like image 580
michael nesterenko Avatar asked Jul 18 '11 11:07

michael nesterenko


1 Answers

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.

like image 56
user207421 Avatar answered Oct 22 '22 21:10

user207421