`
fengshihao
  • 浏览: 49831 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XlightWeb 的使用

    博客分类:
  • java
阅读更多

XlightWeb 的使用


本文目的学会使用HttpClient ,同步请求方式, 异步请求方式, timeout设置预处理,发送大数据。

1  XlightWeb是基于xsockets的使用了NIO的框架。
   XlightWeb可以构建同步阻塞的或者异步非阻塞的http客户端和http服务器。


2 先看客户端的构建
   HttpClient
    
HttpClient.gif
这幅图的含义是:HttpClient 实现了 IHttpClientEndpoint接口,里边含有若干HttpClientConnection。
而 HttpClientconnection实现了INonBlockingConnection的tcp链接。 也就是说HttpClient是一个非阻塞
的连接池。
    示例1 用call方法发送请求  
    HttpClient httpClient = new HttpClient();

   //设置一些httpclient的属性
   httpClient.setFollowsRedirect(true);  
   httpClient.setAutoHandleCookies(false);
 
   //生成request
   IHttpRequest request = new GetRequest("http://www.sohu.com");
   //设置request属性
   request.setHeader("Accept-Encoding", "gzip,deflate");
   
   //call方法是同步方法,知道收到http头后才返回,这个方法会阻塞在这里。
   //这里也可以用非阻塞的方式send方法访问 下边示例介绍
   HttpResponse response =   (HttpResponse)httpClient .call(request);
   System.out.println(response.getResponseHeader());

   //获得http头后,http的body并没有收完,可以用response获得BlockingBodyDataSource 
   //或者 NonBlockingBodyDataSource 这里用了阻塞同步的方式
   BlockingBodyDataSource bodyDataSource = response.getBlockingBody() ;
   String data = bodyDataSource.readString( ); 
   System.out.println(data);
   httpClient.close();

  
    示例2 加入 Interceptor 
    Interceptor 允许程序在发送request的是后就是调用call方法之后,call方法返回之前,做一些处理,如
   把这个request记录在日志上。上边代码加入如下一句:
    
     .......
    httpClient.addInterceptor(new HeaderLogFilter());
    ..... .

    //最为一个interceptor 要实现 IHttpRequestHandler 接口的onRequest方法
    class HeaderLogFilter implements IHttpRequestHandler {

              public void onRequest(final IHttpExchange exchange) throws IOException {
                 System.out.println("-------------------intercepter onRequest----------------"); 
                 System.out.println(exchange.getRequest().getRequestHeader());
                 exchange.forward(exchange.getRequest());
           }
        

    示例3 自动重试  
   
     GET DELETE PUT 方法是幂等的,所以多次一样的请求服务器不会出现问题,例如get一个资源失败后再次get
    服务器可以返回一样的结果。默认情况下HttpClient在请求失败后不会自动重试,需要设置 setCallReturnOnMessage
  
     HttpClient httpClient = new HttpClient(); 
     httpClient.setCallReturnOnMessage(true); 
     IHttpResponse response = httpClient.call(new GetRequest("http://www.sohu.com"))

    示例4 HttpClient 异步send方式
    使用异步的方式有两种 一种是使用FutureResponse 一种是使用 send方法指定ResponseHandler。
    这里介绍第二种使用handler

    ......
    //发送请求时生成一个handler 来处理将来的返回
    httpClient.send(request, new MyResponseHandler());
    .....

    //实现 IHttpResponseHandler  接口的Handler
     @Execution(Execution.MULTITHREADED)
      class MyResponseHandler implements IHttpResponseHandler {

            @InvokeOn(InvokeOn.MESSAGE_RECEIVED)
           public void onResponse(IHttpResponse response) throws IOException {
              System.out.println("-------------------Handler onResponse----------------");
              System.out.println(response.getResponseHeader());
           }

           public void onException(IOException ioe) {
              System.out.println("error occured by receiving response " + ioe.toString());
           }
     }

    这里需要注意的是两个 Annotation 。
      Execution    两个参数值  MULTITHREADED 指明回调将在一个线程里完成, NONTHREADED指明回调在I/O主线程完成
    InvokeOn   连个参数 MESSAGE_RECEIVED 回调再收到body之后发生, HEADER_RECEIVED 在收到http头时发生 

    关于 Execution    的更多信息 参考 xSocket 框架图

    architecture.gif

    The Dispatcher (I/O thread) is responsible to perform the socket read & write I/O operations and to delegate the call back handling. By default number of CPUs + 1  dispatchers will be created. A connection is bound to one dispatcher during the total lifetime.
     xSocket uses the worker pool only to perform the handler's call back method. The pool can be set by calling the appropriate setter method. A worker pool has to implement the java.util.concurrent.Executor interface. 

   xSocket 底层有个IO线程负责Connection的读写,IO线程个数为cpu个数+1 ,而handler回调是由一个线程池来处理,
    每个connection是绑定在一个IO线程上的。  所以如果把回调放入到IO线程中处理时 一定注意能有异常和阻塞方法调用。
   否则会只是整个IO线程阻塞。

   示例5 处理timeout
   有三种timeout类型可以设置,各个类型代表的时间如图

  • ConnectionTimeout : 获得链接的时间限制
  • ResponseTimeout : 获得响应的时间限制, 从send到获得header的时间。
  • BodyDataReceiveTimeout : 获取body的时间间隔最长是多少。
ResponseTimeout.gif
    设置timeout
     httpClient .setConnectionTimeoutMillis(24L * 60L * 60L * 1000L); 
     httpClient .setResponseTimeoutMillis(2L * 60L * 1000L); 
     httpClient .setBodyDataReceiveTimeoutMillis(30L * 1000L);

    timeout的处理
     使handler实现接口 IHttpSocketTimeout  的 onException(SocketTimeoutException stoe) 方法
    class MyHandler implements IHttpResponseHandler, IHttpSocketTimeoutHandler { 
               public void onResponse(IHttpResponse response) throws IOException { // ... } 
               public void onException(IOException ioe) { // ... } 
               public void onException(SocketTimeoutException stoe) { // response timeout occured //} 
               }
     
  示例6 异步使用流方式发送request的body
    这种方法在上传文件等发送大数据的时候很有用。
    1  因为body比较大 所以先把reqeust的header 和 body的length发送出去
    2 打开文件构建 FileChannel 然后用 BodyDataSink  传送。 BodyDataSink来自send函数返回
     // create a response handler
     IHttpResponseHandler hdl = new MyResponseHandler();

     // get the file to transfer
     RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
     FileChannel fc = raf.getChannel();
     int bodyLength = (int) fc.size();      

     // 先构建header发送
     IHttpRequestHeader header = new HttpRequestHeader("POST", "http://server:80/in", "text/plain");

     // 如果指定了bodylength 那么就会用非chunk的方式传送数据
     BodyDataSink bodyDataSink = httpClient.send(header, bodyLength, hdl);

     // 这里存在一个同步异步的问题
     bodyDataSink.transferFrom(fc);

     // finish the send procedure
     bodyDataSink.close();
    
   
    这里需要改进一下发送数据时的方式,默认情况下BodyDataSink是同步发送的,也就是把文件里的数据同步自动写入到了
   底层的IO中,这里会造成效率的地下。需要设置为异步的 改动如下

     bodyDataSink.setAutoflush(false);            // 取消自动写入
     bodyDataSink.setFlushmode(FlushMode.ASYNC);  // 设置为异步方式

     // 写入数据 
     bodyDataSink.write(bytebuffer);
   //手动flush到底层IO
     bodyDataSink.flush();

   同时要注意,write时候的bytebuffer 不能重用。 如果需要重复使用write时候的bytebuffer  会造成和底层内部IO线程的竞争,致使数据坏掉。如下摘抄自Xsocket

   By using the  WritableByteChannel  interface methods write(ByteBuffer) and write(ByteBuffer[]) some restriction exits. Calling such a write method in mode ASYNC causes that the byte buffer will be read asynchronously by the internal I/O thread. If the byte buffer will be accessed (reused) after calling the write method, race conditions will occur. The write(ByteBuffer) and write(ByteBuffer[]) should only called in ASYNC mode, if the byte buffer will not be accessed (reused) after the write operation.

4
1
分享到:
评论
2 楼 yunlong167167 2014-07-03  
1234567890
1 楼 jd2bs 2011-03-04  
翻译的不错  跟原文对照看  有收获 呵呵

相关推荐

    xLightweb2.13.2.jar

    不知道是不是最新的,这是我找的最高版本。 如果有更高的版本,告诉我一下

    ws(websocket)例子(xsocket\xlightweb)

    通常,使用xsocket或xlightweb时,你需要在服务器端创建WebSocket服务器,并监听特定端口,然后在客户端创建WebSocket对象并连接到服务器。之后,你可以发送和接收JSON或其他格式的数据。 总结来说,这个压缩包...

    WebAudioAPIError(解决方案).md

    项目中常见的问题,记录一下解决方案

    avnet(安富利)网站详情页数据样例

    avnet(安富利)网站详情页数据样例

    1-全国各地区建筑业-二级专业承包建筑业企业利润总额2005-2012年-社科数据.zip

    该数据集涵盖了2005至2012年间全国各地区二级专业承包建筑业企业的利润总额。这些数据不仅包括了原始数据,还提供了线性插值和ARIMA填补的版本,以便于研究者能够根据不同的需求选择合适的数据形式进行分析。数据集中包含了行政区划代码、地区名称、是否属于长江经济带、经纬度信息、年份以及利润总额等关键指标。这些指标为评估企业的经营效益和盈利水平提供了重要依据,同时也反映了建筑业在不同地区的发展态势。数据来源为国家统计局,确保了数据的权威性和准确性。通过这些数据,研究者可以深入分析建筑业的经济贡献及其在宏观经济中的作用,为政策制定和行业规划提供数据支持。

    CentOS6.4X64安装Oracle11g中文2.05MB最新版本

    本文档主要讲述的是CentOS6.4 X64安装Oracle11g;在CentOS安装oracle11g比安装oracle10g简单很多,oracle可以不设置比如OS内核参数、防火墙、环境变量等,所以实施时推荐安装oracle11g。感兴趣的朋友可以过来看看

    发动机零部件质量信息反馈及处理表.docx

    发动机零部件质量信息反馈及处理表.docx

    1-全国省市县土地利用类型面板数据2009-2021年-社科数据.zip

    全国省市县土地利用类型面板数据2009-2021年是一项详尽的数据集,它基于土地利用方式和地域差异,对土地资源单元进行细致划分,反映了土地的用途、性质和分布规律。该数据集涵盖了全国各省、地级市、县的土地利用类型,包括耕地、园地、林地、交通运输用地、水域及沙地等多种土地类型。时间范围上,省级和地级市的土地利用类型面板数据覆盖2009至2021年;县级土地利用类型面板数据则从2019年开始至2021年。数据指标丰富,包括行政单位、年份以及各类土地利用的具体分类,如水田、水浇地、旱地、果园、茶园等,以及城镇村及工矿用地、交通运输用地、水域及水利设施用地等。这些数据为政府决策、规划编制以及土地资源管理提供了坚实的数据基础,有助于全面了解土地资源的利用状况,并为未来的规划和管理提供支持。

    MediaError(解决方案).md

    项目中常见的问题,记录一下解决方案

    前端跳槽突围课:React18底层源码深入剖析(完结21章)

    好课分享——前端跳槽突围课:React18底层源码深入剖析(完结21章)

    1111java后端1111Controller

    1111java后端1111Controller

    嵌入式系统开发-STM32单片机-电子春联-代码设计

    嵌入式系统开发-STM32单片机-电子春联-代码设计

    潜在失效模式及后果分析(FMEA)应用流程.docx

    潜在失效模式及后果分析(FMEA)应用流程.docx

    使用Python和Matplotlib创建动态3D圣诞树动画

    内容概要:本文详细介绍了如何使用Python和Matplotlib库创建一个动态的3D圣诞树动画。通过代码示例,展示了几何形状的创建方法,如圣诞树的形状、装饰品和星星的位置计算,以及如何通过动画更新函数实现闪烁效果。 适合人群:具有一定Python编程基础的开发者,尤其是对Matplotlib库和数据可视化感兴趣的读者。 使用场景及目标:① 学习Matplotlib库的基本用法,包括3D绘图和动画制作;② 掌握几何形状的数学建模方法,如圆锥和球体;③ 实践动画效果的实现技巧,提升编程技能。 阅读建议:本教程以具体代码示例为主,理论与实践相结合。建议读者在阅读过程中亲自编写和运行代码,逐步理解每一步骤的实现细节。

    开发一个带有 PCIe Endpoint 设备的驱动程序并实现热插拔功能.docx

    开发一个带有 PCIe Endpoint 设备的驱动程序并实现热插拔功能

    ASP+ACCESS课程教学网站信息交流与发布系统(源代码+论文+外文翻译)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    消防气压给水设备和稳压泵安装 分项工程质量验收记录表.docx

    消防气压给水设备和稳压泵安装 分项工程质量验收记录表.docx

    Cytoscape-3-10-0-windows-64bit.exe

    Cytoscape-3-10-0-windows-64bit.exe

    ASP物资管理系统设计与实现(源代码+论文)(源代码+论文+说明文档).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    [net毕业设计]asp.net学生成绩管理系统(源代码+论文).zip

    【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

Global site tag (gtag.js) - Google Analytics