Ужасное время процессора и ApiProxy $ CancelledException - PullRequest
0 голосов
/ 22 августа 2011

То, что я сделал, это веб-сайт фильма.Он покажет последнюю информацию о фильме и расписание сеансов.
У меня есть задание cron для обновления всех воспроизводимых фильмов.Однако всякий раз, когда он запускается, он выдает исключение ApiProxy $ CancelledException и имеет ужасное время процессора около 4706364 cpu_ms 4644739 api_cpu_ms, из-за которого мое приложение очень скоро превышает квоту.Может ли кто-нибудь помочь мне.Спасибо !!

Количество воспроизводимых фильмов около 25, а количество сеансов около 650.

Мой код

// Get all the playing movies from the datasotre
Query query = pm.newQuery(Movie.class);
query.setFilter("playing == true");
List<Movie> playingMovies = (List<Movie>) query.execute();

// Update every playing movie
for (Movie m : playingMovies) {
    // getMovie() will return a movie with latest movie info and showtimes
    Movie leMovie = getMovie(m.getId());
    leMovie.setKey(m.getKey());
    leMovie.setFans(m.getFans());
    // because leMovie has the latest showtimes so I need to delete the older showtimes
    m.getShowtimeList().clear();

    pm.makePersistent(leMovie);
}

Мой фильм Класс

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Movie {


    @Persistent
    private Set<Key> fans;

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private String id;

    @Persistent
    private boolean playing;

    @Persistent
    private int gate;

    @Persistent
    private String picUrl;

    @Persistent
    private String mainName;

    @Persistent(mappedBy = "movie")
    @Element(dependent = "true")
    private List<Showtime> showtimeList;

    //......

Исключение

2011-08-22 10:30:00.138
/cron/update-movie
com.google.apphosting.api.ApiProxy$CancelledException: The API call datastore_v3.Put() was explicitly cancelled.
    at com.google.apphosting.runtime.ApiProxyImpl$5.get(ApiProxyImpl.java:298)
    at com.google.apphosting.runtime.ApiProxyImpl$5.get(ApiProxyImpl.java:296)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:67)
    at com.google.appengine.api.datastore.FutureHelper$CumulativeAggregateFuture.get(FutureHelper.java:144)
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:72)
    at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:33)
    at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:113)
    at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:110)
    at com.google.appengine.api.datastore.TransactionRunner.runInTransaction(TransactionRunner.java:31)
    at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:110)
    at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:94)
    at org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.put(RuntimeExceptionWrappingDatastoreService.java:94)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:180)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:139)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:134)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(DatastorePersistenceHandler.java:536)
    at org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4576)
    at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2814)
    at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:2754)
    at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:2893)
    at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:369)
    at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256)
    at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:801)
    at org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:271)
    at com.mm.servlet.UpdateMovieServlet.doGet(UpdateMovieServlet.java:100)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:262)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9819)
    at com.google.net.rpc.impl.RpcUtil.handleRequest(RpcUtil.java:445)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:414)
    at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:579)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:454)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:694)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:332)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:324)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:452)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)
C 2011-08-22 10:30:00.144
Uncaught exception from servlet
com.google.apphosting.api.ApiProxy$CancelledException: The API call datastore_v3.Put() was explicitly cancelled.
    at com.google.apphosting.runtime.ApiProxyImpl$5.get(ApiProxyImpl.java:298)
    at com.google.apphosting.runtime.ApiProxyImpl$5.get(ApiProxyImpl.java:296)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:67)
    at com.google.appengine.api.datastore.FutureHelper$CumulativeAggregateFuture.get(FutureHelper.java:144)
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:72)
    at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:33)
    at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:113)
    at com.google.appengine.api.datastore.DatastoreServiceImpl$2.runInternal(DatastoreServiceImpl.java:110)
    at com.google.appengine.api.datastore.TransactionRunner.runInTransaction(TransactionRunner.java:31)
    at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:110)
    at com.google.appengine.api.datastore.DatastoreServiceImpl.put(DatastoreServiceImpl.java:94)
    at org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.put(RuntimeExceptionWrappingDatastoreService.java:94)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:180)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:139)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.put(DatastorePersistenceHandler.java:134)
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.updateObject(DatastorePersistenceHandler.java:536)
    at org.datanucleus.state.JDOStateManagerImpl.flush(JDOStateManagerImpl.java:4576)
    at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:2814)
    at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:2754)
    at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:2893)
    at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:369)
    at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256)
    at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:801)
    at org.datanucleus.jdo.JDOPersistenceManager.close(JDOPersistenceManager.java:271)
    at com.mm.servlet.UpdateMovieServlet.doGet(UpdateMovieServlet.java:100)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:262)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9819)
    at com.google.net.rpc.impl.RpcUtil.handleRequest(RpcUtil.java:445)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:414)
    at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:579)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:454)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:694)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:332)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:324)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:452)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)
W 2011-08-22 10:30:00.451
A serious problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. If you see this message frequently, you may be throwing exceptions during the initialization of your application. (Error code 104)

1 Ответ

1 голос
/ 04 апреля 2012

Возможно, уже слишком поздно отвечать ...

Обычное время запроса составляет около одной минуты, если "getMovie (m.getId ());" запрос информации с какого-либо другого сервера может занять много времени и пройти через вашу минуту.

Задача GAE имеет больше времени для запуска заданий, поэтому лучше использовать cron для постановки в очередь нового задания и позволить appengine выполнять свою работу в фоновом режиме.

Task t = new Task();
            t.setUrl(URL_SERVLET_TO_UPDATE_MOVIES);

            //submit task
            TaskReference tr = queue.add(t);

Этот сервлет выполняет задачу обновления фильмов.

Даже если вам нужно больше времени (допустим, у вас там много фильмов), вы можете получить только несколько фильмов за запрос, реализовать их, получить курсор (работает как диапазон) и поставить новую задачу с этим курсором в качестве параметра к сервлету. Это новое задание начнется со следующего фильма, который вы должны реализовать (благодаря курсору), и у вас будет достаточно времени, чтобы выполнить свою работу. Вы можете связать задачу, пока ваша работа не будет завершена.

В вашем сервлете ищите курсор как параметр:

String encodedCursor = req.getParameter(CURSOR_PARAM);
        if (  encodedCursor != null){
            oldCursor = Cursor.fromWebSafeString(encodedCursor);
        }   

Вы можете использовать этот курсор для запроса из последнего запрошенного вами фильма. Получите новый курсор из нового запроса и добавьте его в качестве параметра к новой задаче.

Task t = new Task();
            t.setUrl(PROCESSOR_SERVLET);

            //add cursor as parameter
            t.addParameter(CURSOR_PARAM, cursor.toWebSafeString());

            //submit task
            TaskReference tr = queue.add(t);

Используя Task и курсоры, вы будете выполнять свою работу в фоновом режиме, избегая временных ограничений. Конечно, там есть квоты ...

Док о курсорах: https://developers.google.com/appengine/docs/java/datastore/queries#Query_Cursors

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