2009-10-28 148 views
3

如果我有一個客戶端應用程序一個接一個地向我的Web服務發送請求,Web服務將能夠處理每個請求,並且不會因爲新的請求而覆蓋以前的請求製作?我希望處理所有請求,而不是替換爲其他請求。我能夠做到這一點,所有來自同一客戶端的多個請求Web服務和來自同一客戶端的多個請求

+0

有關服務在服務器端執行哪些操作的更多詳細信息/具體信息? – 2009-10-28 23:18:23

+0

您希望每個請求都有某種請求ID:當然,request-id的空間必須在客戶端進行管理。 – jldupont 2009-10-28 23:20:51

+0

客戶端是多線程的,每個請求一個,或者它是如何發送的? – 2009-10-28 23:55:58

回答

1

答案取決於您的架構。

例如,如果服務器是多線程的,並且業務邏輯部分是無狀態的,那麼在服務器上請求將不會重寫,因爲每個線程都會調用一個函數並返回結果。

在客戶端,最好的辦法是讓每個請求都從不同的線程發送,以便該線程阻塞直到獲得響應,然後處理可以繼續進行。

如果您有不同的設計,請描述它。

UPDATE:基於這裏的新信息是你可能想看看的東西:我很好奇如何,或者如果你正在做異步Web服務調用 http://weblogs.java.net/blog/2006/02/01/can-i-call-you-back-asynchronous-web-services

。一般來說,網絡服務似乎阻止,但如果你打這麼快,那麼我只能假設不同步。

因此,web服務可以在服務器端存儲答案,所以有一個有狀態的類,它通過IP地址將結果存儲在字典中。然後,客戶端會查詢答案,因此,理想情況下,如果您發送請求,您應該能夠獲取一組答案作爲回覆。如果您發送了所有請求並仍在等待更多回復,則輪詢。你應該可以再次獲得一系列答案,以減少浪費的帶寬。

更好的方法是讓你的客戶端也成爲服務器,讓你發送請求,與IP地址:端口回調,所以服務器將使到客戶端的單向響應。但是,這更復雜,但是它減少了浪費帶寬。

更新2:這是正在不檢查就做,所以有可能是錯誤的:

@WebMethod 
public ResponseModel[] AnswerQuestion(QuestionModel[] question) { 
// Get the IP address of the client 
    AnswerController ac = new AnswerController(question, ipaddress); 
    return mypackage.myclass.StaticAnswers.GetAnswers(ipaddress); 
    // return an array 
} 

@WebMethod 
public ResponseModel[] GetAnswers() { 
    return mypackage.myclass.StaticAnswers.GetAnswers(ipaddress); 
} 

OK,這應該給一個大概的瞭解。

AnswerController中沒有任何假設。它應該知道執行該任務所需的所有內容,因爲它將是無狀態的,因此,它指的是沒有可改變的全局變量,只有conststatic變量。

StaticAnswers類是靜態的,僅存儲答案,查找爲ipaddress,以提高速度。

它將返回適當數組中的答案。

當你發送最後一個問題時,只需撥打GetAnswers,直到你找回所有的東西。您可能需要跟蹤客戶端已發送了多少個,以及接收了多少個。

這是不理想的,是一個非常粗略的草圖,但希望它會給你一些工作。

+0

謝謝。這是一個小例子。 客戶端詢問Web服務:什麼是「1 + 1」? 然後,在Web服務甚至可以完成並響應該請求之前,客戶端詢問Web服務:什麼是「3 + 4」 基本上,同一客戶端一次詢問Web服務約一百個問題(請求)。儘管事實上這些都是來自同一客戶端的請求,但我希望Web服務處理它們。 – brandon 2009-10-29 00:27:51

+0

更簡單一點:多個請求一次從同一個客戶端發送,希望web服務可以處理所有請求。 – brandon 2009-10-29 00:29:42

+0

web服務服務器應該是多線程的。你在服務器上使用什麼框架?在服務器端,Web服務端點獲取請求,將問題傳遞給無狀態類進行處理,並且該處理可以將其置於靜態(有狀態)答案類中很重要。 – 2009-10-29 01:23:41

7

我不知道爲什麼其他答案是如此之長,基本上是一個基本的簡單問題,但答案是。除非您專門爲服務器編程某種交叉(例如,每個請求使用的靜態交叉線程列表或更復雜的結構),否則每個請求都是獨立於其他請求的。

如果使用通過事件給出結果的異步模式,在客戶端會遇到交叉更容易 - 您需要確保將結果提供給正確的請求(通常通過提供一些令牌作爲「自定義狀態「變量,您可以使用它來確定響應處理程序中的原始請求)。

相關問題