java - google appengine channel API (Java) 的问题

标签 java google-app-engine servlets 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

我已将该应用程序简化为一个 servlet 和一个 jsp(均已附加),以确保我没有做任何过于复杂的事情。阅读本论坛和其他论坛上的一些消息可能是我滥用了 token 和 channel key ,但我已经尝试了我能想到的所有组合都无济于事!

servlet 片段:

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

从堆栈跟踪来看,客户端连接到 channel 正常,并成功向上发送消息,但将消息写回 channel 的 servlet 是失败的部分。

非常感谢您的帮助!

代码:

ChannelTestController.java

ChannelTestPage.jsp

日志:

/ChannelTestMessage.do com.google.appengine.api.channel.ChannelFailureException: An unexpected error occurred. at com.google.appengine.api.channel.ChannelServiceImpl.getExceptionForError(ChannelServiceImpl.java:112) at com.google.appengine.api.channel.ChannelServiceImpl.sendMessage(ChannelServiceImpl.java:68) at com.webstersmalley.chessweb.web.ChannelTestController.sendMessage(ChannelTestController.java:74) at com.webstersmalley.chessweb.web.ChannelTestController.getChannelTestMessage(ChannelTestController.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:43) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 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 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 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 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 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:439) at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:573) at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448) at com.google.tracing.TraceContext.runInContext(TraceContext.java:688) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318) at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446) 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) Caused by: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 2: Unknown at com.google.net.rpc.RpcStub$RpcCallbackDispatcher$1.runInContext(RpcStub.java:1050) at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448) at com.google.tracing.TraceContext.runInContext(TraceContext.java:688) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318) at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446) at com.google.net.rpc.RpcStub$RpcCallbackDispatcher.rpcFinished(RpcStub.java:1071) at com.google.net.rpc.RPC.internalFinish(RPC.java:2184) at com.google.net.rpc.impl.RpcNetChannel.finishRpc(RpcNetChannel.java:2338) at com.google.net.rpc.impl.RpcNetChannel.messageReceived(RpcNetChannel.java:1267) at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:328) at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:299) at com.google.net.async.Connection.handleReadEvent(Connection.java:474) at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:831) at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207) at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:103) at com.google.net.async.GlobalEventRegistry$2.runLoop(GlobalEventRegistry.java:95) at com.google.net.async.LoopingEventDispatcher$EventDispatcherThread.run(LoopingEventDispatcher.java:385)

最佳答案

我在 Google 自己的 Appengine Java API 讨论论坛上交叉发布了这个问题,并在那里得到了回答。

总结一下,当开启高复制时会出现问题(因为现在所有新应用都默认开启),并且正在使用非默认版本。

我的应用程序是最新的(因此获得了很高的评价),并且我尝试了多种不同的方法来让 channel 正常工作,所以我没有使用我的应用程序的默认版本。将默认值切换为指向最新版本并使用该 URL 导致问题消失!

关于java - google appengine channel API (Java) 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6009684/

相关文章:

java - 无法使用 Spring Boot App 访问 RESTful 服务

google-app-engine - 如何在 AppEngine 中以其他语言显示月份和星期几?

java - Spring afterPropertiesSet 在 Servlet 初始化之前调用?

java - 如何清除状态 401 HttpServletResponse.SC_UNAUTHORIZED?

java - 为什么QMUX.request()方法设计为强制传递超时参数?

java - 编写方法重载的最佳方法是什么?

java - Android 到 WCF 连接被对等方重置

python - 如何将 Stripe 库包含在 Google App Engine 中

python - 查询 Google Cloud 数据存储区且祖先未返回任何内容

java - servlet 过滤器是否必须在 web.xml 文件中指定?