我想了解有关异步通知的更多信息。我有一个以下形式的网址:
http://www.sample.com/AsyncNotify?sessionId=xxxxxx
现在,如果我使用sessionId调用此URL,则相当于注册异步通知。我正在使用Apache HTTP Commons库来做Http Post和Get。如果是这种情况,那么我如何从服务器端接收事件?我是否必须忘记这种方法并使用套接字?目前,这是我的方法:
HttpClient httpClient = new HttpClient;
String url = "http://www.sample.com/AsyncNotify?sessionId=xxxxxx"
GetMethod get = new GetMethod(url);
try {
httpClient.executeMethod(get);
//read the response
} catch(Exception e) {
}
我在想的是在while循环中建立一个套接字级连接,并在收到一些数据时调用一个处理程序,但有没有更好的方法来实现呢?
编辑:
我已经使用xSocket进入下一阶段,但连接在30秒后关闭:
try {
String _GETRequest = "/sample/notify";
HttpClientConnection con = new HttpClientConnection("10.0.0.23", 5050);
con.setConnectionTimeoutMillis(100000);
GetRequest request = new GetRequest(_GETRequest);
request.setParameter("id", id);
IHttpResponseHandler responseHandler = new AsyncHandler();
con.send(request, responseHandler);
org.xlightweb.client.HttpClient httpClient = new org.xlightweb.client.HttpClient();
request.setParameter("id", id);
con.send(request, responseHandler);
// Don't let the program terminate. In other words,
// wait for a message from the server
while(con.isOpen()) {};
if(!con.isOpen()) {
}
} catch (ConnectException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:1)
Tomcat推出了名为Tomcat Comet(http://tomcat.apache.org/tomcat-6.0-doc/aio.html)的技术。它也被用于新的Servlet 3.0规范。此技术将允许您执行持久HTTP连接,通过该连接可以将通知推送到任何客户端。
还有一种名为WebSockets的技术是HTML 5的一部分 (http://dev.w3.org/html5/websockets/)当然,它现在仅适用于一组有限的浏览器。可能应该等待这个。
当然,当前技术向后兼容(即使它很糟糕)的方法是定期轮询服务器并以此方式获得结果。
当然,如果每个人(客户端和服务器)都在本地网络上,那么可能是像RMI甚至是EJB或JMS Pub / Sub这样的东西。
以下是Comet教程http://www.ibm.com/developerworks/web/library/wa-cometjava/index.html和另一个http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp-test.html