Java的异步HTTP客户端

hel*_*eak 18 java http httpwebrequest actionscript-3

作为Java世界中的一个相对新手,我发现很多事情令人沮丧地完成,在许多其他框架中相对微不足道.一个主要的例子是异步http请求的简单解决方案.看起来似乎并不存在,最好的方法是什么?使用像httpclient这样的阻塞类型的lib或内置的java http东西来创建我自己的线程,或者我应该使用更新的非阻塞io java东西 - 对于应该简单的东西来说似乎特别复杂.

我正在寻找的是从开发人员的角度来看易于使用的东西 - 类似于AS3中的URLLoader - 您只需创建一个URLRequest - 附加一堆事件处理程序来处理完成,错误,进度等,并调用一种解雇它的方法.

如果您不熟悉AS3中的URLLoader,它非常简单,看起来像这样:

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
}
Run Code Online (Sandbox Code Playgroud)

len*_*ite 15

使用以前称为ning http客户端库的"Async Http Client".见 http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

现在可以在GitHub上获得 https://github.com/ning/async-http-client


Rob*_*ell 8

Apache Commons版本4.0 HttpClient(现在在HttpComponents/HttpCore中)也支持Java的NIO(非阻塞IO).我认为这是你最好的选择.


Jim*_*ans 6

如果你还没有看过它,请查看Java 5 java.util.concurrent - 它使得多线程应用程序更容易开发.您可以设置一个ThreadPoolExecutor来管理,例如,四个线程.然后,您可以向池中提供任意数量的任务来完成.每个任务都是Runnable.ThreadPoolExecutor将排队Runnable任务并将它们并行提供给可用的Threads.每个Runnable任务完成时,都会调用Pool的afterExecute()方法.

我清楚地记得写一个获取线程池用Java编写的早在1999年网络浏览器,这是一个熊市得到的权利.上个月我为Web服务器编写了一个负载测试器.测试人员有一个ThreadPoolExecutor,它有n个线程,我提供的Runnable任务每个都使用Apache HTTP Client获取一个页面.只花了一两个小时就让它运行得相当好.我想你会喜欢java.util.concurrent和Apache HTTP Client,虽然听起来你需要为进度指示做一些自定义.

(请注意,Apache HTTP Client有自己的线程池,默认配置限制为最多20个线程,每个Web服务器只限两个.)

更新:这是Apache HTTP Client的链接.一定要阅读MultiThreadedHttpConnectionManager,它是处理连接池的,它在最基本的例子中没有显示.

  • 不,这不是Java显示年龄; 检查多个非JDK捆绑的非阻塞(异步)http客户端.不需要明确地混淆线程只是为了进行并发访问.虽然在JDK中使用非阻塞替代方案会很方便,但是有很多有用的东西可能会让JDK不再膨胀. (2认同)

Ale*_*lli 5

看起来你想(的一部分)NIO -有一个很好的教程在这里,异步联网的部分开始在页.30并且最后有许多有用的链接.