• RESTEasy中的HTTP异步处理(下)



    在RESTFul WebService一书中,介绍了使用HTTP协议来实现异步请求的一个轻量级设计模式,叫做ASync Job Service。而RESTEasy很好地支持了这个模式,并提供了一个例子说明使用方法。本文承接 http://bluedash.iteye.com/admin/blogs/1273163,动手做些实验。

    我们仍然使用RESTEasy中提供的async-job-service这个例子来进行展示。这次我们来通过手工操作这个例子,而不是例子中提供的单元测试,来学习RESTEasy支持的两种轻量级HTTP异步处理方式。

    首先需要对MyResource.java做一些改造。将post和put方法中的两处:

    Thread.sleep(1000);
    



    改成:

    Thread.sleep(100000);
    



    通过将线程的等待时间由1秒改为100秒,我们可以有充分的时间来进行一些手工操作,查看程序运行效果。

    修改完成后,我们将WebService服务启动起来,在例子的根目录执行:

    mvn jetty:run
    



    将服务启动。接下来使用linux下面的curl命令来访问webservice。我们分别使用oneway方式及async方式来访问。首先是oneway方式:

    curl -X PUT -v http://localhost:9095/resource?oneway=true
    



    结果如下:

    * About to connect() to localhost port 9095 (#0)
    *   Trying ::1... connected
    * Connected to localhost (::1) port 9095 (#0)
    > PUT /resource?oneway=true HTTP/1.1
    > User-Agent: curl/7.21.2 (x86_64-apple-darwin10.6.0) libcurl/7.21.2 OpenSSL/1.0.0c zlib/1.2.5 libidn/1.19
    > Host: localhost:9095
    > Accept: */*
    > 
    < HTTP/1.1 202 Accepted
    < Content-Length: 0
    < Server: Jetty(6.1.15)
    < 
    * Connection #0 to host localhost left intact
    * Closing connection #0
    



    虽然服务中通过Thread.sleep()@ 指定了处理这个请求需要至少100秒,但是我们指定了使用 @oneway=true的异步方式来访问,因此服务器即时返回给客户端一个 HTTP 202 ACCEPTED,注意上面日志中的:

    HTTP/1.1 202 Accepted
    



    使用oneway方式的问题在于:我们发出请求之后就,就无法得知服务器的处理结果了。因此RESTEasy提供了另一种async方式。我们来玩玩看,仍然是使用curl命令来访问服务:

    curl -d "abc" -H "Content-Type:text/plain" -v http://localhost:9095/resource?asynch=true
    



    上面的curl命令通过POST方法访问/resource服务,提交contents参数为"abc"。查看服务端的代码,便知道/resources的POST方法接受客户端提交的content参数,睡眠100秒,然后返回给客户端content的值。

    此时服务的返回与oneway时类似,但多了一个Location的Header:

    ...
    < HTTP/1.1 202 Accepted
    < Location: http://localhost:9095/asyncjobs/1299164229789-1
    ...
    



    可以看到,除了HTTP 202 ACCEPTED,服务返回给我们一个Location的Header,里面包含一个URL地址。这个地址就是用来查看异步请求的结果的。

    如果我们在得到Location中给出的这个URL地址后,马上访问它:

    curl -v http://localhost:9095/asyncjobs/1299164229789-1
    



    此时会得到这样的结果:

    < HTTP/1.1 202 Accepted
    



    因为我们设定服务要睡眠100秒后开始处理业务逻辑并返回。因此我们马上访问这个用于取得结果的URL时,仍然是HTTP 202 ACCPTED。

    等候1分半钟以上,再次访问试试看:

    curl http://localhost:9095/asyncjobs/1299164229789-1
    



    得到了预期的结果:

    abc
    



    此时网站的HTTP返回值为:

    < HTTP/1.1 200 OK
    < Content-Type: text/plain
    



    通过上述一系列实验,阐述了RESTEasy提供的轻量级HTTP异步化解决方案的使用方法。

    1. <!-- override the bean definition for deployment -->  
    2.     <bean id="resteasy.deployment" class="org.jboss.resteasy.spi.ResteasyDeployment" init-method="start" destroy-method="stop">  
    3.         <property name="asyncJobServiceEnabled" value="true"/>  
    4.         <property name="mediaTypeMappings">  
    5.             <map>  
    6.                 <entry key="json" value="application/json" />  
    7.                 <entry key="xml" value="application/xml" />  
    8.             </map>  
    9.         </property>  
    10.     </bean>
  • 相关阅读:
    yii---模型的创建
    yii---控制器的创建
    yii的安装
    windows下安装composer
    wpgcms---列表页数据渲染
    Twig---基本使用
    wpgcms---详情页面数据怎么渲染
    Twig---的使用
    vue---指令怎么写
    vue---设置缩进为4个空格
  • 原文地址:https://www.cnblogs.com/zouhao510/p/5143901.html
Copyright © 2020-2023  润新知