Проблема с Google Appengine Channel API (Java) - PullRequest
2 голосов
/ 15 мая 2011

У меня проблемы с 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();

Из трассировки стека клиент подключается к каналу OK и успешно отправляет сообщение, но сервлет, записывающий сообщение обратно в канал, является ошибочным битом.

Большое спасибо заранее за любую помощь!

Код:

ChannelTestController.java

ChannelTestPage.jsp

Журналы:

/ ChannelTestMessage.do com.google.appengine.api.channel.ChannelFailureException: произошла непредвиденная ошибка. на com.google.appengine.api.channel.ChannelServiceImpl.getExceptionForError (ChannelServiceImpl.java:112) на com.google.appengine.api.channel.ChannelServiceImpl.sendMessage (ChannelServiceImpl.java:68) в com.webstersmalley.chessweb.web.ChannelTestController.sendMessage (ChannelTestController.java:74) в com.webstersmalley.chessweb.web.ChannelTestController.getChannelTestMessage (ChannelTestController.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:43) в org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod (HandlerMethodInvoker.java:176) в org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod (AnnotationMethodHandlerAdapter.java:426) в org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle (AnnotationMethodHandlerAdapter.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.doPost (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) на org.mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java:388) в org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216) в org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java:182) на org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:765) на org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:418) на org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:152) на org.mortbay.jetty.Server.handle (Server.java:326)в org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:542) в org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete (HttpConnection.java:923) в org.mortbay.jjttp.pl.: 404) на com.google.net.rpc.impl.RpcUtil.runRpcInApplication (RpcUtil.java:439) на com.google.net.rpc.impl.Server $ RpcTask.runInContext (Server.java:573) на ком.google.tracing.: 326) по адресу com.google.tracing.TraceContext $ AbstractTraceContextCallback.runInInheritedContext (TraceContext.java:318) по адресу com.google.tracing.TraceContext $ TraceContextRunnable.run (TraceContext.java:446) в java.Execec.runWorker (ThreadPoolExecutor.java:1110) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java: 603) at 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.run (TraceContext.java:448) по адресу com.google.tracing.TraceContext.runInContext (Trace68).google.tracing..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) по адресу.google.net.rpc.impl.RpcConnection.parseMessages (RpcConnection.java:328) на com.google.net.rpc.impl.RpcConnection.dataReceived (RpcConnection.java:299) на com.google.net.async.Connection.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 Ответ

2 голосов
/ 19 мая 2011

Я опубликовал это на собственном дискуссионном форуме Google для API Java Appengine, и на него был дан ответ.

Подводя итог, можно сказать, что проблема возникает, когда включена высокая репликация (так как все новые приложения по умолчанию используются сейчас) и используется версия не по умолчанию.

Мое приложение было недавним (следовательно, было много повторений), и я пробовал несколько разных способов заставить каналы работать, поэтому я не использовал версию своего приложения по умолчанию. Переключение по умолчанию на последнюю версию и использование этого URL привело к исчезновению проблемы!

...