RESTEasy中的HTTP异步处理(下)

来源:互联网 发布:mac查看当前用户 编辑:程序博客网 时间:2024/05/02 12:42

RESTEasy中的HTTP异步处理(下)

    博客分类: 
  • HTTP
  • RESTEasy
  • WebService
  • Java
resteasyasync异步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方法中的两处: 

Java代码  收藏代码
  1. Thread.sleep(1000);  


改成: 

Java代码  收藏代码
  1. Thread.sleep(100000);  


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

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

Bash代码  收藏代码
  1. mvn jetty:run  


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

Bash代码  收藏代码
  1. curl -X PUT -v http://localhost:9095/resource?oneway=true  


结果如下: 

Bash代码  收藏代码
  1. * About to connect() to localhost port 9095 (#0)  
  2. *   Trying ::1... connected  
  3. * Connected to localhost (::1) port 9095 (#0)  
  4. > PUT /resource?oneway=true HTTP/1.1  
  5. > 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  
  6. > Host: localhost:9095  
  7. > Accept: */*  
  8. >   
  9. < HTTP/1.1 202 Accepted  
  10. < Content-Length: 0  
  11. < Server: Jetty(6.1.15)  
  12. <   
  13. * Connection #0 to host localhost left intact  
  14. * Closing connection #0  


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

Bash代码  收藏代码
  1. HTTP/1.1 202 Accepted  


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

Bash代码  收藏代码
  1. 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: 

Bash代码  收藏代码
  1. ...  
  2. < HTTP/1.1 202 Accepted  
  3. < Location: http://localhost:9095/asyncjobs/1299164229789-1  
  4. ...  


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

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

Bash代码  收藏代码
  1. curl -v http://localhost:9095/asyncjobs/1299164229789-1  


此时会得到这样的结果: 

Bash代码  收藏代码
  1. < HTTP/1.1 202 Accepted  


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

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

Bash代码  收藏代码
  1. curl http://localhost:9095/asyncjobs/1299164229789-1  


得到了预期的结果: 

Bash代码  收藏代码
  1. abc  


此时网站的HTTP返回值为: 

Bash代码  收藏代码
  1. < HTTP/1.1 200 OK  
  2. < Content-Type: text/plain  


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