2016-01-19 84 views
0

我已經實施了長期輪詢實施。發生什麼情況是,當請求到達時,我檢查是否有一些數據可用,如果沒有睡眠線程並遞歸調用方法直到數據可用。長輪詢實施

int time = 0; 
String data; 

public void checkme() {  
    time++; 
    if (data == null && time < 100) { 
     System.out.println("recursive call "+time); 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     checkme(); 
     } else { 
      System.out.println("end recursive call. data available"); 
     } 
} 

但即使當我取消郵遞員的請求,仍然遞歸調用發生在後臺。

所以我認爲我的長輪詢實現是錯誤的,我可能需要跟蹤請求也從服務稍後或使用隊列像數據結構。

+2

這不是遞歸的目的。只需使用一個循環。 – Blorgbeard

+0

謝謝。但我的問題仍然存在。任何建議更好的長期民意調查實施? – Harshana

+0

@Blorgbeard循環的優點是什麼,而不是遞歸?在這裏應用遞歸有什麼問題? – Harshana

回答

0

我認爲正在發生的事情是,當您取消請求時,您沒有任何操作來破壞該代碼或關閉應用程序。

您是否有任何方法可以知道請求在代碼中是否被取消?如果是,只需將其添加到條件中即可。確保代碼將被卡住,直到線程醒來,但仍然會做你想要的。

編輯

你應該從遞歸改變一個簡單的循環如同時或做......一會兒。

+0

我如何跟蹤java類的請求可用性? – Harshana

+0

我不知道您的代碼...您需要提供有關您的應用程序如何工作的更多信息。 – nervousDev

+0

其彈簧啓動應用程序。我放置的代碼來自我的服務類方法,該方法通過其餘控制器 – Harshana

0

好吧,好的等待/通知。

public void waitForData() 
{ 
    synchronized(this) 
    { 
    while(data == null) 
    { 
     wait(5000L); 
    } 
    } 
} 

public void provideData (String dataParam) 
{ 
    synchronized(this) 
    { 
    data = dataParam; 

    // This wakes the waitForData 
    notifyAll(); 
    } 
} 
+0

謝謝。這是在後端長輪詢的方式嗎?順便說一下,仍然假設我已經設定了30分鐘的時間。然後我提出請求並決定在2分鐘內取消它,但後端線程仍然運行28分鐘? – Harshana