1

我在一家汽车租赁公司的日食中用 GWT 编写一个 java 项目。我需要在 2 个机构(服务器)之间交换信息,例如可供出租的汽车列表,并且有人建议我使用gwt-syncproxy。来自网站的描述:

GWT SyncProxy 在 Java 客户端和 RemoteService servlet 之间提供同步 RPC。通过使用 SyncProxy,我们可以从纯 Java(无 JSNI)代码中调用 GWT RemoteService 方法。

我遵循了官方指南(也是网上唯一的指南) https://code.google.com/p/gwt-syncproxy/ 但它不起作用:浏览器中的一条消息说:

插件无法连接到位于 127.0.0.1:9997 的开发模式服务器按照基本故障排除说明进行操作

(我在 java 客户端代码中指定的地址)project.java

  //create new proxy instance for the service interface:
  private static GreetingService rpcService =
       SyncProxy.newProxyInstance(GreetingService.class,
         "http://127.0.0.1:9997", "greet");

  //invoke the RPC method:
   String result = rpcService.greetServer("SyncProxy");

这是GreetingService.java

  @RemoteServiceRelativePath("greet")
      public interface GreetingService extends RemoteService {
        String greetServer(String name);
   }

和服务实现GreetingServiceImpl.java

  public class GreetingServiceImpl extends RemoteServiceServlet
  implements GreetingService {
    public String greetServer(String name) {
     return "Hello, " + name;
    }
  }

我究竟做错了什么?有没有更好的方法可以在不同服务器之间的局域网中进行 RPC?(我在日志文件和 Eclipse 控制台中没有错误)

4

1 回答 1

2

免责声明:我是 Sync-Proxy Android 库的开发人员。

您收到的错误实际上并非来自 gwt-syncproxy 库。它来自 GWT 开发系统,表明浏览器无法联系开发模式系统(由 Eclipse 托管)。需要验证的几件事:

  1. 开发模式主机是否在 Eclipse 中运行(检查 Eclipse 中可用的开发模式视图)没有错误?
  2. 编译前端是否抛出任何错误(检查控制台视图)
  3. 尝试清除您的浏览器缓存(对该错误的简短谷歌搜索产生了一些随机事件,阻止开发模式系统正确锁定)
  4. 尝试在不支持开发模式的情况下浏览到托管 url(IE 没有在浏览器中导航到 127.0.0.1:8888 或 eclipse 说它托管您的应用程序的任何地方)并验证您的页面是否正确加载。如果没有,我建议创建一个全新启动的 GWT 项目并验证它是否正常工作,以确保您的计算机上没有其他服务阻塞)

作为后续行动,我对您的设置感到有些困惑。您是在开发 GWT 前端客户端还是 Java 桌面客户端?Sync-proxy 的开发使得常规客户端(GWT 框架之外)可以与 GWT 设计的后端 RPC 一起工作。具体来说,基于服务器的 RemoteService servlet 需要利用 GWT RPC 系统,而不仅仅是常规的 RemoteService servlet。如果您正在开发 GWT 前端客户端,则不需要同步代理,因为常规 GWT 框架可以与 RPC 后端通信。现在,如果我了解您的多服务器通信的目的,那么问题就变成了您是尝试从您的 Web 前端(GWT 客户端)进行这种通信,还是从您的后端的 Java servlet 进行这种通信?

如果这是在前端完成的,恐怕我没有可用的说明供您使用,因为您必须克服跨站点脚本问题,并且 syncproxy 并非设计为在 GWT 前端内工作客户端(我已经测试过了)。如果这是您的意图,那么首先,您需要使用异步方法调用 newProxyInstance:

private static GreetingServiceAsync rpcServiceAsync =
  SyncProxy.newProxyInstance(GreetingServiceAsync.class,
        "127.0.0.1:8888", "greet");

具体来说,您最终会调用此方法两次以到达目标,其中每个 URL 将代表不同的租赁代理服务器。现在,将其托管在您的开发机器上以使其正常工作有点超出此答案的范围,但您也需要考虑到这一点

如果您在后端执行此操作,syncproxy 可能(未经测试)能够满足您的需求,但您需要管理超时情况,因为您正在进行的调用将不是异步的。最重要的是,您必须再次在您的开发环境中设置不同的托管服务器来测试可能的场景。如果这是一个很大的需求,请为 gwt-syncproxy 项目提出问题请求,我也许可以测试该场景并在某处提供说明。

于 2013-11-26T12:22:25.760 回答