#java #google-app-engine #servlets #channel-api
#java #google-app-engine #сервлеты #channel-api
Вопрос:
У меня возникли проблемы с Channel API — буду признателен за любую помощь.
У меня нет проблем с API на локальном сервере разработки, но когда я размещаю его на appspot, я получаю эзотерическое исключение. Прилагается полная трассировка стека, но заголовок:
com.google.appengine.api.channel.ChannelFailureException: An unexpected error occurred.
Caused by: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 2: Unknown
Я свел приложение к сервлету и jsp (оба прилагаются), чтобы убедиться, что я не делаю ничего сверхсложного. Читая некоторые сообщения на этом форуме и другие, возможно, я неправильно использую токены вместо ключей канала, но я перепробовал все комбинации, которые только могу придумать, безрезультатно!
Фрагмент сервлета:
ChannelService channelService = ChannelServiceFactory.getChannelService();
String channelKey = getChannelKey(userService.getCurrentUser().getUserId());
String token = channelService.createChannel(channelKey);
и
ChannelService channelService = ChannelServiceFactory.getChannelService();
channelService.sendMessage(new ChannelMessage(channelKey, message));
Фрагмент jsp:
channel = new goog.appengine.Channel(channelToken);
socket = channel.open();
Из трассировки стека клиент подключается к каналу нормально и успешно отправляет сообщение вверх, но сбой происходит в сервлете, записывающем сообщение обратно на канал.
Заранее большое спасибо за любую помощь!
Код:
Журналы:
/ChannelTestMessage.выполните com.google.appengine.api.channel.Исключение ChannelFailureException: произошла непредвиденная ошибка. на com.google.appengine.api.channel.ChannelServiceImpl.getExceptionForError(ChannelServiceImpl.java:112) на com.google.appengine.api.channel.ChannelServiceImpl.Отправка сообщения (ChannelServiceImpl.java: 68) на com.webstersmalley.chessweb.web.ChannelTestController.Отправка сообщения (ChannelTestController.java: 74) на com.webstersmalley.chessweb.web.ChannelTestController.getChannelTestMessage(ChannelTestController.java:68 ) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) в sun.reflect.Делегирование methodaccessorimpl.invoke(делегирование methodaccessorimpl.java:43) в java.lang.reflect.Метод.invoke(Method.java:43) в org.springframework.web.bind.annotation.support.Обработчик.invokeHandlerMethod (HandlerMethodInvoker.java:176) в org.springframework.web.servlet.mvc.annotation.Annotationmethod HandlerAdapter.invokeHandlerMethod (annotationmethod HandlerAdapter.java:426) в org.springframework.web.servlet.mvc.annotation.Аннотационный метод обработки адаптеров.handle (annotationmethod HandlerAdapter.java:414) в org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:790) в org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:719) в org.springframework.web.servlet.FrameworkServlet.ProcessRequest(FrameworkServlet.java:644) в org.springframework.web.servlet.FrameworkServlet.Отправьте (FrameworkServlet.java:560) в javax.servlet.http.HttpServlet.service (HttpServlet.java:637) в javax.servlet.http.HttpServlet.service (HttpServlet.java:717) в org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) в org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java: 1166) в org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java: 1157) в org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java: 1157) в org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) в организации.завершение.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) в org.mortbay.причал.безопасность.SecurityHandler.handle (SecurityHandler.java:216) в org.mortbay.jetty.servlet.Обработчик сеанса.handle (SessionHandler.java:182) в org.mortbay.причал.обработчик.ContextHandler.handle (ContextHandler.java:765) в org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) в org.mortbay.причал.обработчик.HandlerWrapper.handle (HandlerWrapper.java:152) в org.mortbay.причал.Server.handle (Server.java:326) в org.mortbay.причал.HttpConnection.Запрос на обработку (HttpConnection.java:542) в org.mortbay.причал.HttpConnection$RequestHandler.headerComplete (HttpConnection.java:923) в org.mortbay.причал.HttpConnection.обработайте (HttpConnection.java: 404) в com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:439) в com.google.net.rpc.impl.Server$RpcTask.runInContext (Server.java:573) в com.google.tracing.TraceContext$TraceContextRunnable $1.запустите (TraceContext.java:448) на com.google.tracing.TraceContext.runInContext(TraceContext.java:688) на com.google.трассировка.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326) в com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318) в com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) на java.lang.Thread.run (Thread.java: 636) Вызван: com.google.apphosting.api.ApiProxy$Исключение ApplicationException: ApplicationError: 2: Неизвестно в com.google.net.rpc.RpcStub $ RpcCallbackDispatcher $1.runInContext (RpcStub.java: 1050) в com.google.tracing.TraceContext$TraceContextRunnable $1.запустите (TraceContext.java:448) на com.google.tracing.TraceContext.runInContext(TraceContext.java:688) в com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326) в com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318) на com.google.трассировка.TraceContext $TraceContextRunnable.run (TraceContext.java:446) на com.google.net.rpc.RpcStub$RpcCallbackDispatcher.rpcFinished(RpcStub.java: 1071) на com.google.net.rpc.RPC.internalFinish (RPC.java: 2184) на com.google.net.rpc.impl.RpcNetChannel. finishRpc (RpcNetChannel.java: 2338) на com.google.net.rpc.impl.RpcNetChannel.MessageReceived(RpcNetChannel.java:1267) на com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:328) на com.google.net.rpc.impl.RpcConnection.DataReceived(RpcConnection.java:299) на com.google.net. асинхронный.Подключение.handleReadEvent (Connection.java: 474) в com.google.net.async.EventDispatcher.processNetworkEvents (EventDispatcher.java:831) в com.google.net.async.EventDispatcher.internalLoop (EventDispatcher.java:207) в com.google.net.async.EventDispatcher.loop(EventDispatcher.java:103) в com.google.net.async.GlobalEventRegistry $ 2.runLoop (GlobalEventRegistry.java:95) в com.google.net.async.LoopingEventDispatcher$EventDispatcherThread.run(LoopingEventDispatcher.java:385)
Ответ №1:
Я разместил это сообщение на собственном форуме Google для обсуждения Appengine Java API, и там на него был дан ответ.
Вкратце, проблема возникает, когда включена высокая репликация (как и все новые приложения, по умолчанию, сейчас), и используется версия, отличная от стандартной.
Мое приложение было выпущено недавно (следовательно, была включена высокая репутация), и я перепробовал множество разных способов заставить каналы работать, поэтому я не использовал версию своего приложения по умолчанию. Переключение по умолчанию на последнюю версию и использование этого URL-адреса привело к устранению проблемы!
Комментарии:
1. Спасибо, Мэтью, я размещаю здесь ссылку на ваше обсуждение на форуме: groups.google.com/group/google-appengine-java/browse_thread /…