2011-07-18 59 views
3

套件積壓意味着什麼?com.sun.HttpServer套件積壓

例如我有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。

回答

2

這是一個已經被TCP接受的連接隊列,在您調用accept()以在您的應用程序中意識到它們之前。將它設置爲像10這樣的低值是非常沒有意義的:TCP會將其增加到自己的最小值,根據平臺的不同,它可能是50或500,如果不是這樣,所有這些都會導致毫無意義的ConnectExceptions.最好將此值保留爲默認值。

+0

我在客戶端上設置了1000個線程,仍然沒有例外:) –

+0

@misha nesterenko so?這不好嗎? – EJP

+0

可能有時限制總等待連接的數量是好的 –