2008-10-25 73 views

回答

1

GWT並沒有提供批處理任意RPC的一步式解決方案。但是請記住,GWT的自動序列化使得編寫每個RPC方法的串行和批處理版本變得非常容易。例如,假設你定義了這個RPC:

FooResponse callFoo(FooRequest request); 

正是這種容易寫相同的RPC自己的「批量」版本:

ArrayList<FooResponse> batchCallFoo(ArrayList<FooRequest> requests) { 
    ArrayList<FooResponse> responses = new ArrayList<FooResponse>(); 
    for (FooRequest request : requests) { 
    responses.add(callFoo(request)); 
    } 
} 
+0

您的解決方案不起作用,因爲在GWT的RPC是asynchronouse;他們在通話結束後立即返回; AsyncCallback處理程序負責處理值。 – 2008-11-09 18:00:54

1

這是個好問題,但我不認爲有一個簡單的解決方案。

我相信你將不得不創建一個單獨的方法,將你的方法分組在一起,以類似的方式實現DWR的批處理。

也就是說,如果您有:

public int add(int x, int y); 
public int sub(int i, int j); 

你會創建一個新的方法把它們混合起來:

public Map<String, Integer> addAndSub(Map methodsAndArguments) { 
    // Call add and sub methods with it's arguments 
} 

您仍然需要處理過程中的同一回調方法整個響應。

我意識到它可能不是最優雅的解決方案,但由於GWT RPC的工作方式,我認爲這是一條路。對於GWT,我認爲你通常應該嘗試編寫你的方法,以便批量不會成爲你需要考慮的問題。

8

Google的Ray Ryan做了一個關於Best Practices For Architecting Your GWT App的演講,他談到了使用命令模式的問題。發送碰巧經過RPC的異步命令是你可能想要的。一旦發送命令而不是RPC,對其進行批處理非常簡單。對於爲您實現此模式的庫,請參閱​​。我剛剛開始使用它,所以我不知道它是否會自動批量處理,但它全部是開放源代碼的許可證,所以如果不是這樣,您可以修復它。

1

您還可以使用GWTEventService如果您的應用程序適合彗星(服務器端推送)的域:

GWTEventService是基於事件的客戶端服務器通信的框架。它使用GWT-RPC和Comet/server-push技術。客戶端提供了一個高級API,有機會將偵聽器註冊到服務器,如GUI組件。可以將事件添加到服務器端的上下文/域中,並且客戶端上的偵聽器獲知有關傳入事件的信息。服務器端完全獨立於客戶端實現並且高度可配置。

因爲這個事件模型所提供的優點之一是:

活動被捆綁,以減少服務器調用