2011-11-05 34 views
1

我正在用CXF編寫Java web服務。我遇到以下問題:客戶端從web服務調用方法。 Web服務必須並行執行兩件事,並啓動兩個線程。其中一個線程需要來自客戶端的一些額外信息。調用webservice方法時不可能添加此信息,因爲它依賴於web服務中完成的計算。我不能重新設計webservice,因爲它是一個課程分配的一部分,分配給我說我必須這樣做。我想暫停該線程並在客戶端提供附加信息時通知它。不幸的是,在Java中不可能通知特定的線程。我找不到任何其他方式來解決我的問題。暫停並通知Java Web服務中的特定線程

有人有建議嗎?

回答

1

我已經編輯了我的答案後想到更多

你有一個相當複雜的架構,如果你的客戶需要服務器的信息來完成請求,那麼我認爲你需要發佈一個或多個'幫助'方法。

例如,你可以發佈(沒有所有的Web服務註釋):然後

MyData validateMyData(MyData data); 

boolean processMyData(MyData data); 

客戶會打電話validateMyData()多次因爲它很喜歡,直到它知道它的完整信息。服務器可以修改MyData中的變量(通過計算,數據庫查詢或其他),以幫助完成信息並將其傳回給客戶端(用於更新UI,如果有的話)。

一旦信息完成,客戶可以撥打processMyData()來處理完整的請求。

這樣做的好處是可以在不需要後臺線程的情況下實現服務器方法,因爲它們應該能夠使用服務器環境提供的請求線程完成它們的工作。

唯一需要注意的是,如果MyData可能會變得非常大,並且您不想在客戶端和服務器之間來回傳遞它。在這種情況下,您需要想出一個較小的類,它只包含服務器想要對MyData所做的更改,並排除不需要更正的數據。

1

海事組織對於一個Web服務請求有效地不完整是很奇怪的。爲什麼不能一次性傳遞所有信息?我會嘗試重新設計你的服務,並使其失敗,如果你通過處理請求所需的所有信息。

編輯:好吧,如果你真的要做到這一點,我不會實際上啓動一個新的線程,當你收到第一個請求。我將存儲來自第一個請求的信息(無論是在數據庫中還是隻在內存中,如果這只是一個虛擬的請求),然後當請求進入時,啓動該線程。

+0

我也很想一次性傳遞所有信息。不幸的是,它不是一個「真正的」網絡服務,而是一個課程分配和分配的一部分,我必須這樣做。 – punkyduck

+0

@punkyduck:好的,編輯... –