我需要一些框架,這將幫助我通過http進行異步流。它可能看起來像SOAP WS或別的什麼。我不知道我是否正確命名,所以這裏是我需要的:異步web服務流
ServerA想通過http向遠程ServerB發出請求。該請求包含任意信息。結果將包含相同類型的多個記錄。其中一些可立即使用,其他則稍後可用。 ServerA希望儘快獲得可用結果,而不必等到所有結果都可用。在現實世界中,ServerB將搜索不同的數據源,其中一些數據源對其他數據源的響應更快。
我能想到3種解決方案。首先,服務器A產生的請求隨機ID,執行SOAP請求
void ServerB.startSearch(id, request);
,將立即返回,然後週期性調用
Result[] ServerB.areThereAnyNewResults(id);
所以服務器A民調SERVERB脫穎而出新reasults。我將這種方法稱爲輪詢。它涉及到從A建立B.另一個解決方案是在ServerA側露出接收服務的多個連接,像
ServerA.acceptResults(String id, Result[] newResults);
和呼叫
ServerB.startSearch(id, request, serverAReceivingServiceEndpoindAddress);
所以服務器B推新結果ServerA.acceptResults()時新的結果可用。我稱之爲推動。它涉及從A到B建立的1個連接以及從B到A建立的多個連接。
另一種選擇是在單個響應內通過相同的http信道流式傳輸結果。如果A執行http調用(我不知道它是否可以是SOAP或應該是別的東西),B開始搜索,當新的結果可用時,它通過http流發送它們並刷新它,因此它們可能是立即在A方提供。它不會關閉http連接,直到所有結果都可用。它只涉及從A到B的單一連接,這就是爲什麼我更願意使用它。我稱之爲流媒體。我瞭解,如果某個代理正在緩衝響應內容,它可能無法正常工作。
所以,我的問題是,如果有任何解決方案,將爲我做大部分工作。我想要做的是A面
Service s = new RemoteAsyncService("http://serverb.com/serviceEndpoint", RemoteAsyncService.STREAMING);
// or RemoteAsyncService.POLLING, or RemoteAsyncService.PUSHING
Request r = new Request(...);
Callback callback = new Callback(){
void newResults(Result[] result){...}
// e should be null if finished correctly
void requestFinished(RemoteException e){...}
}
s.search(request, callback);
調用這樣的代碼並執行它ServerB上側
public ServiceImpl implements Service{
void search(Request r, Callback c){
// perform search, call c.newResult() when new results are available
}
}
,其餘的由框架處理,包括當它被丟棄重新建立連接,如果由於緩衝代理服務器無法完成流式傳輸,則輪詢/推送;在ServerB完成工作或拋出異常時調用callback.requestFinished()。最後還應該以某種標準方式處理認證。
那麼,有什麼解決方案可以抽象通信的方式嗎,並且在可能的情況下能夠流式傳輸嗎?
如果沒有,你認爲將它作爲開源實現會有用嗎? :)
對於彗星,servlet容器如[碼頭] [1]有合理的支持。是的,這聽起來像彗星可能在這裏幫助。 相反,SOAP可能並不是那麼有用 - 相反,Comet或RESTish Web服務可以提供更大的靈活性。 [1]:http://www.mortbay.org/jetty/ – StaxMan 2009-04-20 21:06:43