RPC调用 - 静态方法不起作用

时间:2013-08-05 05:26:53

标签: java gwt rpc

我试图在服务接口中定义一个静态方法来进行rpc调用。但它不允许我这样做。在这里,我正在粘贴我的代码

客户端类

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值更改为static但不允许我这样做?为什么呢?

2 个答案:

答案 0 :(得分:1)

因为RemoteServiceServlet需要以某种方式调用您的服务方法,并且实现需要实例方法。但这不应该阻止您将方法数据分配给静态字段。请注意多线程。

答案 1 :(得分: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的单例实例,从而为您提供全局存储数据的位置。我希望这会对你有所帮助。