这个问题可能看起来很愚蠢/微不足道,但我根本无法理解如何实现我的目标。(对不起,如果标题误导,想不出更好的)
我在使用 GWT 的 App Engine 服务器上有一个网页。我得到了客户端代码和服务器代码。客户端代码可以毫无问题地调用 RPC 方法(我的问题与“gwt-client”完全无关)。
我有以下课程:
//MyClassService.java - client package
@RemoteServiceRelativePath("myService")
public interface MyClassService extends RemoteService{
public doSomething();
}
//MyClassServiceAsync.java - client package
public interface MyClassServiceAsync{
public void doSomething(AsyncCallback<Void> callback);
}
//MyClassServiceImpl.java - server package
public class MyClassServiceImpl extends RemoteServiceServlet implements MyClassService{
@Override
public void doSomething()
{
//does something
}
}
一个场景和我想做的事情:我有一个远程客户端,换句话说,一个没有通过“GWT-interface”通过页面连接的客户端,它是一个简单地向路径发出 GET、POST 请求的客户端在服务器上(从其他地方)。这个远程客户端根本没有“使用”GWT。客户端通过 HttpServlet 进行连接,在这个 servlet 内部我想重用 RPC 机制,这样我就不必重写位于客户端并使用客户端相关代码的接口(实现已经是服务器端)。
要在服务器端重用现有方法,我可以创建 MyClassServiceImpl.java 的实例并使用它们。但是正如您在上面看到的,它们是作为同步方法实现的,因为 GWT-RPC 在使用 GWT-RPC 时会自动使调用异步。
我将如何在服务器端重用 MyClassServiceImpl 并将它们作为异步的?
另外,如果我对所采用的方法有误,请提出其他解决方案。例如,一种解决方案可能是远程客户端直接与 RemoteServiceServlet 通信,而不是创建客户端通过其连接的 HttpServlet,但我不知道这是否可能(如果可能,请告诉我如何)!
谢谢!
编辑(感谢下面的一些答案,我得到了一些见解,并将尝试改进我的问题):
这些方法的服务器端实现是同步的。这意味着他们将阻塞直到返回结果。当从 gwt-client 代码中调用这些方法时,它们会“自动”变为 ASYNCHRONOUS,可以通过执行以下操作来调用它们:
MyClassServiceAsync = (MyClassServiceAsync) GWT.create(MyClassService.class);
ServiceDefTarget serviceDef = (ServiceDefTarget) service;
serviceDef.setServiceEntryPoint(GWT.getModuleBaseURL() + "myService");
service.doSomething(new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
//do something when we know server has finished doing stuff
}
@Override
public void onFailure(Throwable caught) {
}
});
从上面的代码可以看出,doSomething 方法支持 AsyncCallback,甚至没有实现它。这就是我在服务器端想要的,所以我不必使用线程或为“异步使用”创建新的实现。对不起,如果我不清楚!