2016-06-09 18 views
0

我有一個不在我的控制下的隊列,如果它沒有收到針對之前觸發的請求的響應,則每隔1分鐘觸發一次HTTP請求。我的HTTP請求在內部執行超過一分鐘的一系列操作,並在一分鐘後給出響應。映射HttpRequests

編輯:這是一個副作用,當第二個請求到達時,第一個請求已經執行。第二個請求返回失敗,因爲它被第一個請求阻止,並且原始請求完成時返回成功。

不受我控制的隊列綁定到顯示成功或失敗的UI元素。因此,現在發生的事情是,一旦被觸發,首先顯示失敗狀態,這是第二個請求的響應的結果,該響應由於其提前失敗而返回更快,並且由於原始請求成功完成而成功。

對此的假設解決方案是將任何新的HTTP請求映射到當前正在執行的HTTP請求。由於它們將共享相同的內存位置,因此只有在執行完成後,該請求才會返回響應。

這可以在Java中實現嗎?

回答

1

您需要異步工作並將中間數據保存到數據庫。

這裏是一個可能的僞代碼:

// Servlet code 

receive requestX 
requestOnDatabase = loadFromDatabase(requestX); 
if (requestOnDatabase) { 
    if (requestOnDatabase.state == FINISHED) { 
     return requestOnDatabase.result; 
    } else { 
     return NOT_YET_FINISHED; 
    } 
} else { 
    requestX.state = NEW_REQUEST; 
    addToDatabase(requestX); 
    startThread(requestX); 
} 
return NOT_YET_FINISHED; 


// Asynchronous thread 
... 
requestX.result = ... 
requestX.state = FINISHED; 
saveOnDatabase(requestX); 

這種代碼將啓動異步線程,並返回一個代碼,只表示該請求已經採取和進程已啓動,但沒有完成。

任何連續的請求都會檢查數據庫的狀態,並返回當前狀態(如果尚未完成)。

最後在異步線程結束後,任何連續的請求都會返回保存在數據庫中的結果。

這可以用下面的模式

Servlet     Asynchronous thread  Database 
---------------------------------------------------------------- 
First Request received 
Request not present on db 
Create new record on db 
                 request.state = NEW_REQUEST 
Starts new thread 
          xxxxxxxxxxxxxxxxxxxx 
          Thread started 
returns NEW_REQUEST 


.... 

Second Request received 
Request present on db 
returns NEW_REQUEST  

... 

Request received 
Request present on db 
returns NEW_REQUEST  

          request.state = FINISHED 
          request.result = XXX 
          saveToDb(request) 
          end of asynchronous thread 
          xxxxxxxxxxxxxxxxxxxxxxxxxx 

                 request.state = FINISHED 
                 request.result = XXX 

... 

Third Request received 
Request present on db 
returns request.result 


... 

Fourth Request received 
Request present on db 
returns request.result 
+0

正在處理當前的請求時,新的請求到達時進行說明。因此,會發生什麼是新的傳入請求將返回一個失敗,然後完成原始請求返回一個成功代碼。 – Sujith

+0

原始請求和新請求都會失敗。異步線程完成後的第三個請求將工作。一般來說,在異步線程結束之前收到的每個請求都會失敗,異步線程結束後的任何請求都會工作 –

+0

不受我控制的隊列綁定到顯示成功或失敗的UI元素。因此,現在發生的事情是,一旦被觸發,首先顯示失敗狀態,這是第二個請求的響應的結果,該響應由於其提前失敗而返回更快,並且由於原始請求成功完成而成功。 – Sujith