2014-10-28 44 views
1

我正在開發一個基於REST的Web應用程序,它將爲一些數據異步調用第三個系統(使用websockets)。所以 瀏覽器 - > REST - >我的Web應用程序 - >另一個應用程序 - >我的Web應用程序 - >瀏覽器 我的Web應用程序與另一個APP之間的通信是異步的,我只能跟蹤使用某些標識符的請求的響應。 因此,我請求C爲<counter>.C,並且響應將爲<counter>.Response,其中兩個計數器都是相同的。POJO物業更改監聽器 - 理想的方式

要映射響應請求,我將命令,計數器,標誌設置爲一個bean。我保持一段時間循環,不斷檢查標記是否已設置。一旦我得到響應,設置標誌,while循環退出,我知道數據是可用的。

這是正確的方法嗎?有沒有一種方法可以使這一點更好,因爲我覺得(我可能錯了!)保持一個開放的while循環是不正確的。

類豆設置像下面,

public void setAllProperties(){ 
bean.setCommand(commandString); 
bean.setCounter(counter); 
bean.hasResponse(false); 
} 

在web服務的片段是

bean.setAllProperties(); 
sendToApplication(bean); 
int checkCounter = 0; 
while(!bean.hasResponse && checkCounter > 0){ 
    if(bean.hasResponse){ 
    checkCounter++; 
    // loggers and other logic here 
    } 
} 
+0

是怎樣的「其他應用程序」能夠更新你的bean類? – 2014-10-28 04:00:36

+0

那麼它沒有更新bean類,它正在返回一個響應。使用websocket – aksappy 2014-10-28 05:03:23

回答

3

環路擊敗了很多的異步操作的值無關。它也消耗大量的CPU時間(嘗試添加延遲 - 快速休眠 - 使用此類循環時)。

我推薦使用「wait()」和「notify()」/「notifyAll()」。

在那種在等待響應的代碼,做這樣的事情:

synchronized (bean) { 
    while (! bean.hasResponse) { 
     bean.wait(); 
    } 
} 

在該處理響應,並更新豆代碼:

synchronized (bean) { 
    bean.hasResponse = true; 
    bean.notifyAll(); 
} 
+0

這工作得很好,我也添加了一個超時,以確保沒有線程無限等待。謝謝。回覆晚了非常抱歉。 – aksappy 2014-12-12 11:38:38