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

Posted

技术标签:

【中文标题】RPC 调用 - 静态方法不起作用【英文标题】:RPC call - static methods is not working 【发布时间】:2013-08-05 05:26:52 【问题描述】:

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

【问题讨论】:

您将错误答案标记为已接受答案,因为它会给您带来错误 - 请参阅我自己的答案。 【参考方案1】:

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

【讨论】:

将数据存储在 RemoteServiceServlet 实例的静态字段中不是可行的方法,并且会给您带来错误,因为您无法控制它将存储在哪个 servlet 实例中 - 请参阅我自己的答案。 【参考方案2】:

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 的单例实例,从而为您提供一个全局存储数据的地方。我希望这会对你有所帮助。

【讨论】:

以上是关于RPC 调用 - 静态方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

通过 JNI 调用简单的 java 静态方法不起作用,尽管 c++ 编译并运行它

静态方法在 PHP 中的 Web 服务器上不起作用

猫鼬中的链式静态方法不起作用

java中的静态方法有啥作用?

在EL中使用静态方法

RPC 实现、静态方法或带有服务定位器的实例方法