AppEngine + GWT-RPC + API поиска дает ошибку - PullRequest
0 голосов
/ 29 апреля 2018

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();
}

StackTrace:

com.google.apphosting.api.ApiProxy $ CallNotFoundException: Невозможно выполнить поиск вызова API.IndexDocument в потоке, который не является ни потоком исходного запроса, ни потоком, созданным ThreadManager на 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.FutureHelper.getInternal (FutureHelper.java:73) на com.google.appengine.api.search.FutureHelper.quietGet (FutureHelper.java:32) на com.google.appengine.api.search.IndexImpl.put (IndexImpl.java:485) на com.vehicle.track.server.User.save (User.java:82) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at 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) at 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) at java.lang.Thread.run (Thread.java:748)

1 Ответ

0 голосов
/ 30 апреля 2018

С помощью среды выполнения Java8 App Engine вы можете создавать потоки, используя ThreadManager API API-интерфейса App Engine и встроенные API Java, например new Thread(). Однако, как указано в документации :

В настоящее время, если вы хотите вызвать API-интерфейсы App Engine (com.google.appengine.api. *), вы должны вызывать эти API из запроса или из потока, созданного с помощью API ThreadManager.

В вашей Stacktrace я вижу, что вы действительно используете фоновый поток через пул потоков. Вам нужно будет реализовать его с помощью API ThreadManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...