Used multiple threads to connect to the same server (httpcomponents-client 
4.0.1). Each thread represents an account on the server and has different 
username/password combination, so different cookies. Normally 1000 threads are 
used. The problem is, even though I configured the ThreadSafeClientConnManager 
to use 2000 connections, it seems that it only used 2 to 3 connections at the 
same time (I used fiddler to check it). 1000 requests (one request per thread) 
takes about 500 seconds to complete. Unacceptable performance. Most probable 
reason is incorrect configuration. I'm new to network programming and 
httpcomponents, and I can not figure out and solve the problem.  Your help is 
much appreciated. 

The following is a class I use to communicate with the server. Each thread has 
an instance of this class.

public class ServerCommunicator {

        ServerCommunicator(String baseUrl) {
                if (!httpClientInitialized)
                        initializeHttpClient();
                this.baseUrl = baseUrl;
                this.context = new BasicHttpContext();
                this.cookieStore = new BasicCookieStore();
                this.context.setAttribute(ClientContext.COOKIE_STORE, 
this.cookieStore);
        }

        public void setBaseUrl(String baseUrl) {
                this.baseUrl = baseUrl;
        }

        public void readCookies(String cookieFile) throws NumberFormatException,
                        IOException {
                String name = null;
                String value = null;
                String comment = null;
                // String commentUrl = null;
                Date expiryDate = null;
                // boolean isPersistent = false;
                String domain = null;
                String path = null;
                int[] ports = null;
                boolean isSecure = false;
                int version = 0;

                BufferedReader reader = new BufferedReader(new 
FileReader(cookieFile));
                String line;
                while ((line = reader.readLine()) != null) {
                        String[] cols = line.split(",");
                        name = cols[0].length() == 0 ? null : cols[0];
                        value = cols[1].length() == 0 ? null : cols[1];
                        comment = cols[2].length() == 0 ? null : cols[2];
                        // commentUrl = cols[3].length() == 0 ? null : cols[3];
                        expiryDate = cols[4].length() == 0 ? null : new 
Date(Long
                                        .parseLong(cols[4]));
                        // isPersistent = Boolean.parseBoolean(cols[5]);
                        domain = cols[6].length() == 0 ? null : cols[6];
                        path = cols[7].length() == 0 ? null : cols[7];
                        ports = null;
                        if (cols[8].length() != 0) {
                                String[] strPorts = cols[8].split(" ");
                                ports = new int[strPorts.length];
                                for (int i = 0; i < strPorts.length; i++)
                                        ports[i] = 
Integer.parseInt(strPorts[i]);
                        }
                        isSecure = Boolean.parseBoolean(cols[9]);
                        version = Integer.parseInt(cols[10]);

                        BasicClientCookie cookie = new BasicClientCookie(name, 
value);
                        cookie.setComment(comment);
                        cookie.setDomain(domain);
                        cookie.setExpiryDate(expiryDate);
                        cookie.setPath(path);
                        cookie.setSecure(isSecure);
                        cookie.setVersion(version);

                        this.cookieStore.addCookie(cookie);
                }

                reader.close();
        }

        public void writeCookies(String cookieFile) throws IOException {
                int[] ports = null;

                BufferedWriter writer = new BufferedWriter(new 
FileWriter(cookieFile));
                StringBuilder line = new StringBuilder(256);

                List<Cookie> cookies = this.cookieStore.getCookies();
                for (Cookie cookie : cookies) {
                        line.append(cookie.getName());
                        line.append(',');
                        if (cookie.getValue() != null)
                                line.append(cookie.getValue());
                        line.append(',');
                        if (cookie.getComment() != null)
                                line.append(cookie.getComment());
                        line.append(',');
                        if (cookie.getCommentURL() != null)
                                line.append(cookie.getCommentURL());
                        line.append(',');
                        if (cookie.getExpiryDate() != null)
                                line.append(cookie.getExpiryDate().getTime());
                        line.append(',');
                        line.append(cookie.isPersistent());
                        line.append(',');
                        if (cookie.getDomain() != null)
                                line.append(cookie.getDomain());
                        line.append(',');
                        if (cookie.getPath() != null)
                                line.append(cookie.getPath());
                        line.append(',');
                        ports = cookie.getPorts();
                        if (ports != null) {
                                line.append(ports[0]);
                                for (int i = 1; i < ports.length; i++) {
                                        line.append(' ');
                                        line.append(ports[i]);
                                }
                        }
                        line.append(',');
                        line.append(cookie.isSecure());
                        line.append(',');
                        line.append(cookie.getVersion());

                        writer.write(line.toString());
                        writer.newLine();
                        line.delete(0, line.length());
                }

                writer.close();
        }

        public synchronized byte[] getData(String path)
                        throws ClientProtocolException, IOException {
                String url = getUrl(path);
                HttpGet getReq = new HttpGet(url);
                HttpResponse resp = httpClient.execute(getReq, this.context);
                statusCode = resp.getStatusLine().getStatusCode();
                HttpEntity entity = resp.getEntity();
                if (entity != null) {
                        return EntityUtils.toByteArray(entity);
                } else {
                        return null;
                }
        }

        public synchronized String get(String path) throws 
ClientProtocolException,
                        IOException {
                String url = getUrl(path);
                HttpGet getReq = new HttpGet(url);
                HttpResponse resp = httpClient.execute(getReq, this.context);
                statusCode = resp.getStatusLine().getStatusCode();
                HttpEntity entity = resp.getEntity();
                if (entity != null) {
                        return EntityUtils.toString(entity);
                } else {
                        return null;
                }
        }

        public synchronized String post(String path, String content)
                        throws ClientProtocolException, IOException {
                String url = getUrl(path);
                HttpPost postReq = new HttpPost(url);
                StringEntity postEnt = new StringEntity(content);
                postEnt.setContentType("application/x-www-form-urlencoded");
                postReq.setEntity(postEnt);
                HttpResponse resp = httpClient.execute(postReq, this.context);
                statusCode = resp.getStatusLine().getStatusCode();
                HttpEntity entity = resp.getEntity();
                if (entity != null) {
                        return EntityUtils.toString(entity);
                } else {
                        return null;
                }
        }

        public synchronized String post(String path, List<NameValuePair> params)
                        throws ClientProtocolException, IOException {
                String url = getUrl(path);
                HttpPost postReq = new HttpPost(url);
                UrlEncodedFormEntity postEnt = new UrlEncodedFormEntity(params,
                                HTTP.UTF_8);
                postEnt.setContentType("application/x-www-form-urlencoded");
                postReq.setEntity(postEnt);
                HttpResponse resp = httpClient.execute(postReq, this.context);
                statusCode = resp.getStatusLine().getStatusCode();
                HttpEntity entity = resp.getEntity();
                if (entity != null) {
                        return EntityUtils.toString(entity);
                } else {
                        return null;
                }
        }

        public static void main(String[] args) {
        }

        private String getUrl(String path) {
                return path.startsWith("http://";) ? path : baseUrl + path;
        }

        private int statusCode = 0;
        public int getStatusCode() {
                return statusCode;
        }
        
        private String baseUrl = null;
        private HttpContext context = null;
        private CookieStore cookieStore = null;
        private static HttpClient httpClient = null;
        private static String proxyHost = null;
        private static int proxyPort = 80;
        private static boolean httpClientInitialized = false;

        public static void setProxy(String host, int port) {
                proxyHost = host;
                proxyPort = port;
        }
        
        private static void initializeHttpClient() {
                if (!httpClientInitialized) {
                        // Create and initialize HTTP parameters
                        HttpParams params = new BasicHttpParams();
                        ConnManagerParams.setMaxTotalConnections(params, 2000);
                        // ConnManagerParams.setTimeout(params, 10000); // in 
millisecs
                        HttpProtocolParams.setVersion(params, 
HttpVersion.HTTP_1_1);

                        // Create and initialize scheme registry
                        SchemeRegistry schemeRegistry = new SchemeRegistry();
                        schemeRegistry.register(new Scheme("http", 
PlainSocketFactory
                                        .getSocketFactory(), 80));

                        ClientConnectionManager cm = new 
ThreadSafeClientConnManager(
                                        params, schemeRegistry);

                        httpClient = new DefaultHttpClient(cm, params);

                        if (proxyHost != null) {
                                httpClient.getParams().setParameter(
                                                ConnRoutePNames.DEFAULT_PROXY,
                                                new HttpHost(proxyHost, 
proxyPort));
                        }
                        httpClient.getParams().setParameter("http.useragent",
                                        "Mozilla/4.0 (compatible; MSIE 6.1; 
Windows XP)");
                        
httpClient.getParams().setParameter("http.protocol.allow-circular-
redirects", true);
                        httpClientInitialized = true;
                }
        }
        
        public static void shutdown() {
                httpClient.getConnectionManager().shutdown();
        }
}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to