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方法中的两处:
改成:
通过将线程的等待时间由1秒改为100秒,我们可以有充分的时间来进行一些手工操作,查看程序运行效果。
修改完成后,我们将WebService服务启动起来,在例子的根目录执行:
将服务启动。接下来使用linux下面的curl命令来访问webservice。我们分别使用oneway方式及async方式来访问。首先是oneway方式:
结果如下:
虽然服务中通过Thread.sleep()@ 指定了处理这个请求需要至少100秒,但是我们指定了使用 @oneway=true的异步方式来访问,因此服务器即时返回给客户端一个 HTTP 202 ACCEPTED,注意上面日志中的:
使用oneway方式的问题在于:我们发出请求之后就,就无法得知服务器的处理结果了。因此RESTEasy提供了另一种async方式。我们来玩玩看,仍然是使用curl命令来访问服务:
上面的curl命令通过POST方法访问/resource服务,提交contents参数为"abc"。查看服务端的代码,便知道/resources的POST方法接受客户端提交的content参数,睡眠100秒,然后返回给客户端content的值。
此时服务的返回与oneway时类似,但多了一个Location的Header:
可以看到,除了HTTP 202 ACCEPTED,服务返回给我们一个Location的Header,里面包含一个URL地址。这个地址就是用来查看异步请求的结果的。
如果我们在得到Location中给出的这个URL地址后,马上访问它:
此时会得到这样的结果:
因为我们设定服务要睡眠100秒后开始处理业务逻辑并返回。因此我们马上访问这个用于取得结果的URL时,仍然是HTTP 202 ACCPTED。
等候1分半钟以上,再次访问试试看:
得到了预期的结果:
此时网站的HTTP返回值为:
通过上述一系列实验,阐述了RESTEasy提供的轻量级HTTP异步化解决方案的使用方法。
我们仍然使用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异步化解决方案的使用方法。
0 0
- RESTEasy中的HTTP异步处理(下)
- RESTEasy中的HTTP异步处理
- RESTEasy中的通用异常处理ExceptionMapper
- 理解Spring MVC中的异步处理请求(下)
- HTTP request 异步处理
- RestEasy测试Http-API
- resteasy 异常处理
- Servlet中的异步处理
- 创建异步 HTTP 处理程序
- 创建异步 HTTP 处理程序
- 创建异步 HTTP 处理程序
- asio异步处理http请求
- JBOSS7下部署服务(一):EJB3集成Resteasy
- .net 中的异步处理温习
- Servlet 3.0中的异步处理
- Servlet 3.0中的异步处理
- 异步编程中的异常处理
- webservice(resteasy demo)
- HTTPhttp请求
- Codeforces 25BPhone numbers(此题有毒可以忽略)
- 相机漫游(旋转缩放)
- xmpp即时聊天学习记录
- 从关系型数据库到非关系型数据库
- RESTEasy中的HTTP异步处理(下)
- 触摸屏接口
- 从相册中取出gif图片
- VMware Fusion 8 for Mac序列号
- oracle 锁表
- java类作为JNI参数
- python过滤文件
- js拼接运算符
- android线程池