在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异步化解决方案的使用方法。