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
如果你还没有看过它,请查看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,它是处理连接池的,它在最基本的例子中没有显示.
| 归档时间: |
|
| 查看次数: |
26372 次 |
| 最近记录: |