AppEngine + GWT-RPC + Search API 给出错误



Appengine - 1.9.63

GWT - 2.8.1

客户端到服务器端调用:使用标准 GWT RPC 实现

服务器端代码:

IndexSpec indexSpec = IndexSpec.newBuilder().setName("index").build(); 
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
Document doc = Document.newBuilder()...
try{
    index.put(doc); //Line that results in an exception
}catch(Exception e){
    e.printStackTrace();
}

堆栈跟踪:

com.google.apphosting.api.ApiProxy$CallNotFoundException:无法进行 API 调用搜索。IndexDocument 在一个既不是原始请求线程也不是 ThreadManager在 com.google.apphosting.api.ApiProxy$CallNotFoundException.foreignThread(ApiProxy.java:800( 创建的线程中 at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:175( at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:172( at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89( at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89( at com.google.appengine.api.search.FutureHelper.getInternal(FutureHelper.java:73( at com.google.appengine.api.search.FutureHelper.quietGet(FutureHelper.java:32( at com.google.appengine.api.search.IndexImpl.put(IndexImpl.java:485( at com.vehicle.track.server.User.save(User.java:82( at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method( at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62( at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43( at java.lang.reflect.Method.invoke(Method.java:498( at com.google.gwt.user.server.rpc.rpc.invokeAndEncodeResponse(RPC.java:587( at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333( at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303( at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373( at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62( at javax.servlet.http.HttpServlet.service(HttpServlet.java:707( at javax.servlet.http.HttpServlet.service(HttpServlet.java:790( at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812( at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587( at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143( at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577( at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223( at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127( at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515( at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185( at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061( at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141( at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97( at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95( at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97( at org.eclipse.jetty.server.Server.handle(Server.java:499( at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311( at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257( at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544( at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635( at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555( at java.lang.Thread.run(Thread.java:748(

借助 App Engine

Java8 运行时环境,您可以使用 App Engine 的 ThreadManager API 和 Java 的内置 API 创建线程,例如 new Thread() 。但是,如文档中所述:

目前,如果您想调用应用引擎 API (com.google.appengine.api.*(,您必须从请求中调用这些 API 线程或使用 ThreadManager API 创建的线程。

我可以在您的堆栈跟踪中看到您确实通过线程池使用后台线程。您需要使用 ThreadManager API 实现它。

相关内容

最新更新