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 调用 - 静态方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章