Skip to main content

Asynchronous HTTP Client for Java


As a relative newbie in the Java world, I am finding many things frustratingly obtuse to accomplish that are relatively trivial in many other frameworks. A primary example is a simple solution for asynchronous http requests. Seeing as one doesn't seem to already exist, what is the best approach? Creating my own threads using a blocking type lib like httpclient or the built-in java http stuff, or should I use the newer non-blocking io java stuff - it seems particularly complex for something which should be simple.



What I am looking for is something easy to use from a developer point of view - something similar to URLLoader in AS3 - where you simply create a URLRequest - attach a bunch of event handlers to handle the completion, errors, progress, etc, and call a method to fire it off.



If you are not familiar with URLLoader in AS3, its so super easy and looks something like this:




private void getURL(String url)
{
URLLoader loader = new URLLoader();
loader.addEventListener(Event.Complete, completeHandler);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

URLRequest request = new URLRequest(url);

// fire it off - this is asynchronous so we handle
// completion with event handlers
loader.load(request);
}

private void completeHandler(Event event)
{
URLLoader loader = (URLLoader)event.target;
Object results = loader.data;

// process results
}

private void httpStatusHandler(Event event)
{
// check status code
}

private void ioErrorHandler(Event event)
{
// handle errors
}


Source: Tips4allCCNA FINAL EXAM

Comments

  1. Use the "Async Http Client" formerly called ning http client library.
    See
    http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

    Now Available at GitHub
    https://github.com/sonatype/async-http-client

    ReplyDelete
  2. Version 4.0 of Apache Commons HttpClient (now in HttpComponents/HttpCore) also support Java's NIO (non-blocking IO). I think this is your best bet.

    ReplyDelete
  3. Looks like you want (a part of) NIO -- there's a good tutorial here, the asynchronous networking part starts at p. 30 and there are many useful links at the end.

    ReplyDelete
  4. The Jetty HTTP client is asynchronous.

    ReplyDelete
  5. If you haven't looked at it already, check out the Java 5 java.util.concurrent -- it makes multi-threaded apps much easier to develop. You can set up a ThreadPoolExecutor that manages, say, four Threads. You then feed the pool any number of tasks to complete. Each task is a Runnable. The ThreadPoolExecutor will queue up the Runnable tasks and feed them to available Threads in parallel. The Pool's afterExecute() method is called when each Runnable task completes.

    I vividly remember writing a fetch thread pool for a web browser written in Java back in 1999, and it was a bear to get right. Last month I wrote a load tester for a web server. The tester has a ThreadPoolExecutor that has n threads, and the Runnable tasks I feed it each fetch a page using Apache HTTP Client. It took just an hour or two to get it working reasonably well. I think you'll like java.util.concurrent coupled with Apache HTTP Client, though it sounds like you'll need to do some customization for progress indication.

    (Note that Apache HTTP Client does its own thread pooling, and the default configuration limits you to 20 threads max, and only two to each web server.)

    Update: Here's the link to Apache HTTP Client. Be sure to read up on MultiThreadedHttpConnectionManager, it's what handles the connection pool, and it's not shown in the most basic example.

    ReplyDelete
  6. So, it is probably worth considering that actionscript and Java don't server the same niche. For example, Java does make some things more tedious - but usually that is to give the user more options in how, for example, an HTTP connection is executed, whereas actionscript might abstract details or possible errors away for ease of use. But, your point still stands.

    I myself am not aware of an asynchronous HTTP client for Java. Alex Martelli's answer talks about Java's NIO, which is a good answer if you are interested in implementing the HTTP protocol in your own code. NIO will let you use sockets to connect to the web server - but then you have to manually create your own GET requests and parse the incoming HTTP headers/data.

    Another option is to use the java.net.URL classes - and you can find many tutorials for those online and on stackoverflow. You can wrap those in threads - so your java program has multiple threads of execution.

    But then you run into the problem of synchronization. Which I agree, is a pain, but then it offers a more granular level of flexibility.

    (I realize that this doesn't answer your question - and if anybody actually knows of a java facility to do asynchronous http requests, I'd be interested to know!)

    ReplyDelete
  7. AFAIK the TCPMon tool takes a similar approach to what you describe. You can take a look at the source code in their SVN browser

    Also have a look at WGET-java for the guts of the blocking code.

    But do you have to write this in Java? There are a lot of other approaches using JRuby or Rhino to accomplish something like this easily that will run on the JVM but aren't written in Java.

    ReplyDelete
  8. httpunit and htmlunit are 2 customizable and configurable Java http clients able to anything a browser such as simulate firefox, headless browsing, scheduled software clients and agents.

    ReplyDelete
  9. I'd recommend firing separate threads for that.

    ReplyDelete
  10. Take also a look into http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html
    This article discusses async HTTP based on a HttpClient named xLightweb

    ReplyDelete
  11. I just stumbled upon the asynchronous HTTP client implemented within Geronimo. You might also want to take a look it, at http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ - Caveat: the latest commit seems over a year old.

    Another project building an asynchronous HTTP client is xsocket: xsocket.sourceforge.net

    ReplyDelete
  12. Asyncweb provides an asynchronous http client along with its http server. Available for download from the following location:

    https://svn.apache.org/repos/asf/mina/asyncweb/trunk

    ReplyDelete

Post a Comment

Popular posts from this blog

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex