我试图使用JAX-RS(Jersey实现)进行长轮询,但它并不像我期望的那样工作。也许我有什么误解。我会非常感激任何建议。
请注意,出于安全原因,使用反向连接(例如Atmosphere,Comet等)不是一个选择。目前我正在使用Tomcat 7进行开发。
以下方法是从JQuery Ajax调用中调用的(使用
另一种方法是在我的应用程序中调用(在JMS调用之后):
请注意,出于安全原因,使用反向连接(例如Atmosphere,Comet等)不是一个选择。目前我正在使用Tomcat 7进行开发。
以下方法是从JQuery Ajax调用中调用的(使用
$.ajax
)。@Path("/poll")
@GET
public void poll(@Suspended final AsyncResponse asyncResponse)
throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
this.asyncResponse = asyncResponse;
// wait max. 30 seconds using a CountDownLatch
latch.await(getTimeout(), TimeUnit.SECONDS);
}
}).start();
}
另一种方法是在我的应用程序中调用(在JMS调用之后):
@POST
@Path("/printed")
public Response printCallback() {
// ...
// I expect the /poll call to be ended here from the client perspective but that is not the case
asyncResponse.resume("UPDATE");
latch.countDown();
return Response.ok().build();
}
如果我在poll
方法中删除线程创建,那么它可以工作,但问题是线程会一直占用。如果我使用线程创建,则该方法会直接返回,浏览器无法检测到长轮询的结束。
我做错了什么?
@ManagedAsync
是 Jersey 特有的。我通常更喜欢标准方式。 - LaurentG