服务器端使用异步,主要是为了将 处理连接 和 处理请求分开,进行解耦。这样将大大提供系统的吞吐量,不会影响到连接的线程。
1、AsyncResponse的使用
@Path("/async")
@GET
public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
asyncResponse.setTimeoutHandler(new TimeoutHandler() {
@Override
public void handleTimeout(AsyncResponse asyncResponse) {
asyncResponse.resume(
Response.status(Response.Status.SERVICE_UNAVAILABLE).entity("Operation time out.").build());
}
});
asyncResponse.setTimeout(5, TimeUnit.SECONDS);
threadPool.submit(new Runnable() {
@Override
public void run() {
String result = veryExpensiveOperation();
asyncResponse.resume(result);
}
private String veryExpensiveOperation() {
//非常耗时的操作。。。
return "success";
}
});
}
使用@ASuspended注解来标识异步方法,并使用异步响应类AsyncResponse来返回具体的数据。
当耗时操作完成时,使用resume方法唤醒连接线程,返回具体数据。
AsyncResponse实例,默认是没有超时时间的,可以通过setTimeout设置超时时间,以及超时后的操作。
2、回调
CompletionCallback:当请求完成或失败时执行
ConnectionCallback:在与客户机的连接关闭或丢失时执行
asyncResponse.register(new CompletionCallback() {
@Override
public void onComplete(Throwable throwable) {
if (throwable == null) {
System.out.println("ok");
} else {
System.out.println("error:" + throwable.getMessage());
}
}
});