【发布时间】:2015-01-03 19:51:45
【问题描述】:
对于异步编程,Jersey (JAX-RS) 提供了一个ConnectionCallback 回调,该回调将在连接断开时执行。来自Jersey docs:
由于一些异步请求可能需要很长时间来处理客户端可能 决定在响应之前终止其与服务器的连接 已恢复或在完全写入客户端之前。到 处理这些用例可以使用 ConnectionCallback。这 仅当连接过早时才会执行回调 在将响应写入背面时终止或丢失 客户。请注意,响应时不会调用此回调 写入成功,客户端连接按预期关闭。
听起来不错,但我永远无法点燃它。
这里有一些代码:
@GET
@Produces(MediaType.TEXT_PLAIN)
@ManagedAsync
@Path("/poll")
public void poll(@Suspended final AsyncResponse asyncResponse) {
asyncResponse.register(new CompletionCallback() {
@Override
public void onComplete(Throwable throwable) {
logger.info("onComplete called.");
}
});
asyncResponse.register(new ConnectionCallback() {
@Override
public void onDisconnect(AsyncResponse disconnected) {
logger.info("onDisconnect called.");
}
});
asyncResponse.setTimeout(POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS);
asyncResponse.setTimeoutHandler(new TimeoutHandler() {
@Override
public void handleTimeout(AsyncResponse asyncResponse) {
logger.info("handleTimeout called.");
asyncResponse.resume(Response.status(Response.Status.OK).entity("TIMEOUT").build());
}
});
}
显示的另外两个回调,CompletionCallback 和 TimeoutHandler,触发得很好,没有失败。如果达到指定的超时持续时间,TimeoutHandler 将触发。如果 AsyncResponse 实例被恢复,则 CompletionCallback 触发。
但是,使用 ConnectionCallback,我可以关闭、终止或以其他方式停止连接到上面显示的 Web 服务的客户端,并且 ConnectionCallback 永远不会被触发。
我错过了什么吗? ConnectionCallback 是否在泽西岛实现? (在 JAX-RS 规范中它是可选的,但 Jersey 文档谈论它好像它已经实现了。)
我们将不胜感激。
【问题讨论】:
标签: java web-services asynchronous jersey jersey-2.0