2

我正在尝试在服务接口中定义一个静态方法来进行 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 值更改为静态,但它不允许我这样做?为什么?

4

2 回答 2

1

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

于 2013-08-05T05:41:51.030 回答
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 的单例实例,从而为您提供一个全局存储数据的地方。我希望这能帮到您。

于 2013-08-05T14:33:40.970 回答