2010-10-21 88 views
3

我正在尋找一個例子,如何實現在Java longpoling機制。我很樂意使用無狀態的EJB。長輪詢與Java和JBoss

我知道,這樣的事情會的工作:

@WebService(serviceName="mywebservice") 
@Stateless 
public class MyWebService { 
    @WebMethod 
    public String longPoll() { 
     short ct = 0; 
     while(someCondition == false && ct < 60) { 
      sleep(1000); // 1 sec 
      ct++; 
     } 
     if (someCondition) 
      return "got value"; 
     else 
      return ""; 
    } 
} 

不幸的是我知道這一點兒也不規模。我可以在webmethod中返回而無需完成響應並在其他地方完成它?

+0

我刪除了JAX-WS標記,因爲這個問題是不是JAX-WS ... – 2010-10-23 01:40:59

+0

如果這是一個錯誤,如果問題似乎是關於JAX-WS,然後回滾(但在這種情況下,你應該考慮使用我的答案中提到的JAX-WS支持)。 – 2010-10-23 01:44:23

回答

2

你想實現的東西被稱爲服務器推送。 每個Web服務器/應用服務器有一個線程池,說10個線程的處理Web請求,如果所有這些線程將進入「睡眠」沒有其他的Web請求將被服務,直到其中的一個「睡」存在。一些解決方案是增加那些線程的數量,但是你會吃更多的內存和更多的操作系統資源(每個線程成本)。所以是的,你的'服務器推送'的實現是不可擴展的。

解決方案:

  • 你的web應用程序可以發送一個HTTP請求,每(說)5秒,要檢查你的 'someCondition' 改變,然後獲取數據
  • 據我所知,Tomcat的(這樣的JBoss太)已經具有支持這種請求,所以Thread.sleep()方法或將不再需要信號燈一些「連接器」
  • 利用最新的Web服務器實現的Servlet API 3,它也有這樣的長時間運行HTTP請求
  • 支持
  • 閱讀更多:Online tutorials for implementing comets (server push)
+0

我知道我的例子沒有擴展。它看起來像你所說的連接器是APR連接器。不幸的是我找不到關於如何使用連接器的許多信息。 – Laures 2010-10-21 15:16:51

+0

我認爲,這些鏈接可以幫助你:http://tomcat.apache.org/tomcat-6.0-doc/aio.html,http://www.javalobby.org/java/forums/t92965.html。同時請記住Servlet 3 API(即將或將成爲標準)。告訴我們你的結果。 – iirekm 2010-10-22 08:40:56