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>
posted @ 2016-01-20 00:58  zouhao510  阅读(1090)  评论(0编辑  收藏  举报