2010-06-24 67 views
3

我想了解更多關於異步通知。我有一個URL形式:註冊異步通知的URL?

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(); 
     } 

回答

1

Tomcat的推出了一款名爲Tomcat的彗星(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是最好的。

這裏是一個彗星教程http://www.ibm.com/developerworks/web/library/wa-cometjava/index.html,另一個http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp-test.html

+0

@Romain:感謝您的輸入。我正在修改如何編寫與Comet服務器一起工作的Java客戶端。至於WebSocket,我的服務器不支持它,所以這不是一個選項。如果你在一個與Comet服務器一起工作的非常簡單的基於純Java的客戶端上有一些輸入,我會非常喜歡。 – Legend 2010-06-26 04:12:44

+0

@Legend - 您正在使用哪個應用服務器?你的客戶寫了什麼?我在回答結尾添加了一些鏈接,可能有助於 – 2010-06-26 04:18:10

+0

@Romain:感謝您的回覆。我認爲服務器使用灰熊彗星'https:// grizzly.dev.java.net /'我可以使用XMLHttpRequest使用JavaScript處理,但使用Java,出於某種原因,它不響應。我已經看過你發佈的教程。我添加了教程中提到的jar,但像IHttpRequestHandler等一些類仍然不可見。 – Legend 2010-06-26 05:16:57