【发布时间】:2013-11-17 15:10:13
【问题描述】:
这个问题可能看起来愚蠢/微不足道,但我根本无法理解如何实现我的目标。 (对不起,如果标题误导,想不出更好的)
我在使用 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 接口”通过页面连接的客户端,它只是一个客户端,它只是向服务器上的路径(从其他地方)发出 GET、POST 请求。这个远程客户端根本没有“使用”GWT。客户端通过 HttpServlet 进行连接,在这个 servlet 内部我想重用 RPC 机制,这样我就不必重写位于客户端并使用客户端相关代码的接口(实现已经是服务器端)。
要重用服务器端的现有方法,我可以创建 MyClassServiceImpl.java 的一个实例并直接使用它们。但是正如您在上面看到的,它们是作为同步方法实现的,因为 GWT-RPC 在使用 GWT-RPC 时会自动使调用异步。
我将如何在服务器端重用 MyClassServiceImpl 并将它们作为异步的?
另外,如果我对所采用的方法有误,请提出其他解决方案。例如,一种解决方案可能是远程客户端直接与 RemoteServiceServlet 通信,而不是创建客户端通过其连接的 HttpServlet,但我不知道这是否可能(如果可能,请告诉我如何)!
谢谢!
编辑(感谢下面的一些答案,我得到了一些见解,并将尝试改进我的问题):
方法的服务器端实现是同步的。这意味着他们将阻塞直到返回结果。从 gwt-client 代码调用这些方法时,它们会“自动”变为异步,可以通过执行以下操作来调用它们:
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,甚至没有实现它。这就是我在服务器端想要的,所以我不必使用线程或为“异步使用”创建新的实现。对不起,如果我不清楚!
【问题讨论】:
-
HTTP 协议基于请求-响应原则。所以本质上每个请求都是“阻塞的”——客户端打开一个连接,发送请求,等待回复,然后服务器关闭连接。请注意,服务器是多线程的,可以同时处理多个请求(= 创建并行线程并并行调用 servlet 方法),因此几乎不需要在服务器端进行异步处理。你真正想解决什么问题?
-
请注意,您必须通过启用并发请求在 GAE 上显式启用多线程:developers.google.com/appengine/docs/java/config/…
-
感谢您的意见!这更像是一个“保持代码干净”的问题,然后是一个实际的问题。正如您在问题的编辑部分中看到的那样。我真正追求的是尽可能保持服务器和客户端上的代码相同,因此我不必在服务器上为该方法的 AsyncCallback 版本创建实现。当我真正指的是方法的 AsyncCallback 版本时,我可能太快使用“异步”这个词。
标签: java google-app-engine gwt servlets