How to Download and Parse a JSON string faster over HTTP in java

450 views Asked by At

Currently, I'm working on tuneup client/server application communicated via http using HttpURLConnection.

Here, the client sends a java-serializable object as the request to a server (HttpServlet receives this) and it receives a JSON string as the response.

Then that JSON response is forwarded to a JSON parser to process.

Previously, first we downloaded and constructed the complete JSON string comming through the stream and then we forwarded it to the parser. Then I tuned it up to forward the stream it-self to the parser (Jackson Streaming parser) and let it to process on the part that it receives without waiting to download the entire JSON string.

This gives good results when the download speed is good. But here I'm getting not that much good results in one environment, since it is getting so much time to download and it process very faster. (sometimes 17(s) to download 4-5MB JSON string).

How can tune this up to download and parse the JSON faster than this?

Client

URL url = new URL(http://myhost.com/Connectors/url2Service);
HttpURLConnection servletConnection = (HttpURLConnection) url.openConnection();

servletConnection.setDoInput(true);  
servletConnection.setDoOutput(true);  
servletConnection.setUseCaches (false);  
servletConnection.setDefaultUseCaches (false);  
servletConnection.setRequestMethod("POST");
servletConnection.setRequestProperty("content-type","application/x-java-serialized-object");
servletConnection.setRequestProperty("Accept","application/json");
servletConnection.setRequestProperty("Accept-Encoding","gzip,deflate");
servletConnection.setRequestProperty("user-agent","Mozilla(MSIE)");
servletConnection.setConnectTimeout(30000);
servletConnection.setReadTimeout(60000);
servletConnection.connect();


String encodingHeader = servletConnection.getHeaderField("Content-Encoding");

String contentType = servletConnection.getHeaderField("content-type");

if(contentType.equals("application/json")){

    InputStream inputStream = servletConnection.getInputStream();

    if(encodingHeader != null && encodingHeader.toLowerCase().indexOf("gzip") != -1) {

        gzipis = new GZIPInputStream(inputStream);

    } else {

        iSR = new InputStreamReader(inputStream);
        br = new BufferedReader(iSR);

    }

    ResposeObject resposeObject = new JsonString2ResposeObject().parse(gzipis); // previously we passed complete String here
}

Server

public class url2Service extends HttpServlet{

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            ObjectInputStream ois = new ObjectInputStream(request.getInputStream());
            RequestObject requestObject = (RequestObject) ois.readObject();

            response.setContentType("application/json");

            String jsonResponseString = new ServerApplication().doMoreWithRequest(requestObject);

            OutputStreamWriter wr = null;

            if (null != aEncoding && aEncoding.toLowerCase().indexOf("gzip") != -1) {
                gzipos = new GZIPOutputStream(response.getOutputStream());
                wr = new OutputStreamWriter(gzipos);                    
                response.addHeader("Content-Encoding", "gzip,deflate");                 
            } else {
                wr = new OutputStreamWriter(response.getOutputStream());
            }

            wr.write(jsonString);
            wr.flush();
    }

}
0

There are 0 answers