2013-08-05 30 views
2

我想在服務接口中定義一個靜態方法來進行rpc調用。但它不允許我這樣做。我在這裏貼上我的代碼RPC調用 - 靜態方法不起作用

Client類

public void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics) { 
    String url = GWT.getModuleBaseURL() + "domesticservice"; 
    domesticServiceAsync = (DomesticServiceAsync) GWT.create(DomesticService.class); 
    ServiceDefTarget endpoint = (ServiceDefTarget) domesticServiceAsync; 
    endpoint.setServiceEntryPoint(url); 
    domesticServiceAsync.sendDomesticData(product,dma,yrmnths,dist,metrics,new Domestichandler<Void>()); 
} 

public class Domestichandler<Void> implements AsyncCallback<Void> { 
    @Override 
    public void onFailure(Throwable caught) { 
     String error = caught.getMessage(); 
     System.out.println(error); 
    } 

    public void onSuccess(Void result) { 
     System.out.println("perfect"); 
    } 
} 

Service 
public interface DomesticService extends RemoteService { 
    public void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics); 

} 

public interface DomesticServiceAsync { 
    void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics,AsyncCallback<Void> callback); 
} 

服務器端 -

public void sendDomesticData(String product, String dma, String yrmnths, String dist, String metrics) { 
    System.out.println(product); 
} 

基本上我試圖從前臺界面到服務器端發送的價值觀和我不想要任何返回值。但傳遞給服務器端的值應該全局存儲在服務器類中,這樣我就可以用不同的方法訪問這些值。我嘗試將所有senddomestic值更改爲靜態,但它不會允許我這樣做?爲什麼?

+0

您將錯誤的答案標記爲已接受的答案,因爲它會給您帶來錯誤 - 請參閱我自己的答案。 – mlkammer

回答

1

因爲RemoteServiceServlet需要以某種方式調用您的服務方法,並且實現需要實例方法。但是這不應該阻止你將方法數據分配給靜態字段。只需注意多線程。

+0

將數據存儲在RemoteServiceServlet實例的靜態字段中並不是要走的路,並且會給您帶來錯誤,因爲您無法控制將存儲在哪個servlet實例中 - 請參閱我自己的答案。 – mlkammer

1

GWT總是使用RPC調用的實例方法,在這種情況下,靜態方法是不可能的。

瞭解GWT的重要之處在於,任何RemoteServiceServlet實例都是由servlet容器(例如Tomcat)創建和維護的。 servlet容器可能會在啓動時創建大量servlet實例(Tomcat默認會創建6個RemoteServiceServlet實例),然後使用負載平衡來確定哪個servlet在特定時間點處理RPC請求。當然,根據設置,您幾乎不能控制哪個RemoteServiceServlet實例準確處理特定的RPC請求。

因此,如果要使用RPC調用在服務器端全局上存儲信息,YuPPie提出的使用RemoteServiceServlet實現的靜態字段的想法是一個壞主意。您將不知道服務器維護的哪個RemoteServiceServlet實例包含您的靜態數據,並且任何後續調用來檢索數據都會導致不穩定的結果。

雖然你有幾個選擇。將信息存儲在數據庫中(或類似的東西)是最直接的選擇,但從你的文章中,我猜你想要更簡單一些。一個持有你的數據的單例類可能是要走的路。一個線程安全的例子:

public class DataContainer 
{ 
    private static DataContainer _singleton; 

    private String _dataField1; 

    public static synchronized DataContainer getInstance() 
    { 
    if (_singleton == null) 
     _singleton = new DataContainer(); 
    return _singleton; 
    } 

    public synchronized String getDataField1() 
    { 
    return _dataField1; 
    } 

    public synchronized void setDataField1(String dataField1) 
    { 
    _dataField1 = dataField1; 
    } 
} 

然後在服務器端實現你的RPC調用的,你可以這樣做:

public void sendDomesticData(String product, String dma, String yrmnths, String dist, String metrics) 
{ 
    DataContainer.getInstance().setDataField1(product); 
} 

這樣一來,如果有多個servlet的情況下,他們將所有的份額DataContainer的單例實例,從而爲您提供一個全局存儲數據的地方。我希望這能幫到您。