2009-04-20 156 views
3

我需要一些框架,這將幫助我通過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()。最後還應該以某種標準方式處理認證。

那麼,有什麼解決方案可以抽象通信的方式嗎,並且在可能的情況下能夠流式傳輸嗎?

如果沒有,你認爲將它作爲開源實現會有用嗎? :)

回答

1

你在說什麼聽起來像一個COMET服務。你可以在這裏閱讀維基百科條目:

Comet (programming)

不知道你會如何在Java中實現類似的東西,但在.NET中,你可以使用WCF服務雙工協定。你可以閱讀更多有關如何獲取和交流與服務的這種風格在這裏:

How to: Access Services with a Duplex Contract

+0

對於彗星,servlet容器如[碼頭] [1]有合理的支持。是的,這聽起來像彗星可能在這裏幫助。 相反,SOAP可能並不是那麼有用 - 相反,Comet或RESTish Web服務可以提供更大的靈活性。 [1]:http://www.mortbay.org/jetty/ – StaxMan 2009-04-20 21:06:43