Google app engine AppEngine&x2B;GWT-RPC+;搜索API给定错误
Appengine-1.9.63 GWT-2.8.1 客户端到服务器端调用:使用标准GWT RPC实现 服务器端代码:Google app engine AppEngine&x2B;GWT-RPC+;搜索API给定错误,google-app-engine,gwt,google-cloud-platform,Google App Engine,Gwt,Google Cloud Platform,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
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:无法在既不是原始请求线程也不是ThreadManager创建的线程的线程中进行api调用search.IndexDocument
位于com.google.apphosting.api.ApiProxy$CallNotFoundException.foreignThread(ApiProxy.java:800)
位于com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:175)
位于com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:172)
位于com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89)
位于com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89)
在com.google.appengine.api.search.futureheloper.getInternal(futureheloper.java:73)
位于com.google.appengine.api.search.futureheloper.quietGet(futureheloper.java:32)
位于com.google.appengine.api.search.IndexImpl.put(IndexImpl.java:485)
位于com.vehicle.track.server.User.save(User.java:82)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于com.google.gwt.user.server.rpc.rpc.invokeAndEncodeResponse(rpc.java:587)
位于com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333)
位于com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303)
位于com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)
位于com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
位于org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
位于org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
位于org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
位于org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
位于org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
位于org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
位于org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
位于org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
位于org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
位于org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
位于org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
位于org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:95)
位于org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
位于org.eclipse.jetty.server.server.handle(server.java:499)
位于org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
位于org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
位于org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
位于org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
位于org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
在java.lang.Thread.run(Thread.java:748)使用App Engine Java8运行时环境,您可以使用App Engine和java的内置API创建线程,例如
new Thread()
。但是,如合同中所述:
当前,如果要调用应用程序引擎API
(com.google.appengine.api.*),您必须从请求中调用这些api
线程或使用ThreadManager API创建的线程
我可以在Stacktrace中看到,您确实通过threadpool使用了后台线程。您需要使用ThreadManager API来实现它。我在客户端或服务器端实现中没有具体实现任何后台线程。这与基于GWT RPC的服务器通信有关吗?如果是,解决方法是什么?你能分享一些代码吗?