2013-04-24 46 views
-1

我有一個GWT應用程序,它可以在GAE Google App Engine本地運行。使用java.io的Google App Engine限制?

裏面我用下面的JSON類服務器端的RPC服務: http://code.google.com/p/json-io/source/browse/src/main/java/com/cedarsoftware/util/io/JsonWriter.java

我的作品在當地沒有問題,但在雲中部署到谷歌應用程序引擎的時候,我得到一個正確的#1在這個類。

雲中可能存在任何本地不存在的限制,因此它會失敗嗎?或者,雲中的谷歌應用引擎不支持以下任何類別?

import java.io.BufferedWriter; 
import java.io.ByteArrayOutputStream; 
import java.io.Closeable; 
import java.io.Flushable; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.UnsupportedEncodingException; 
import java.io.Writer; 

這是堆棧跟蹤我的AppEngine日誌中獲取:

javax.servlet.ServletContext log: Exception while dispatching incoming RPC call 

java.lang.StackOverflowError 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    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 com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125) 
    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.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:57) 
    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:266) 
    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:146) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:438) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:774) 
    at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.StackOverflowError 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.io.PrintWriter.<init>(PrintWriter.java:116) 
    at java.io.PrintWriter.<init>(PrintWriter.java:100) 
    at java.util.logging.SimpleFormatter.format(SimpleFormatter.java:155) 
    at java.util.logging.StreamHandler.publish(StreamHandler.java:196) 
    at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:105) 
    at java.util.logging.Logger.log(Logger.java:530) 
    at java.util.logging.Logger.doLog(Logger.java:551) 
    at java.util.logging.Logger.log(Logger.java:640) 
    at java.lang.reflect.Field.get(Field.java:30) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeObject(JsonWriter.java:1508) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:636) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeObject(JsonWriter.java:1531) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:636) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeCollectionElement(JsonWriter.java:1441) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeCollection(JsonWriter.java:980) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:608) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeObject(JsonWriter.java:1531) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeObject(JsonWriter.java:1531) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:636) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeObject(JsonWriter.java:1531) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:636) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeCollectionElement(JsonWriter.java:1441) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeCollection(JsonWriter.java:980) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:608) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeObject(JsonWriter.java:1531) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:636) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeObject(JsonWriter.java:1531) 
    at com.google.gwt.user.server.rpc.util.io.JsonWriter.writeImpl(JsonWriter.java:636) 
[and so on...] 
+0

您可以在這裏查看白名單類https://developers.google.com/appengine/docs/java/jrewhitelist – 2013-04-24 14:52:18

+0

每個使用過的類都列入白名單,問題必須在其他地方。最有可能是無限/太深的遞歸。 – MarioP 2013-04-24 15:39:01

回答

0

看來,在當地完成遞歸循環,因爲棧的大小足夠大,以解決操作,但在GAE他們更具限制性。

解決方案是改變你的對象的複雜性,是否有可能在這裏發佈?

+1

嗯不,我不能在這裏發佈,但也許這是因爲我有一些循環依賴。無論如何,本地就像一個魅力,這真的很奇怪...... – membersound 2013-04-24 19:50:36

+0

我已經遇到了一些遞歸調用的問題,固定增加了堆棧,但他們是非常邊緣的情況。通常當你得到這樣的循環時,代碼是錯誤的,也許沒有你的代碼,但你使用的庫。我會在本地調試這個循環,看看它是否被調用了很多次。然後調查你的類,可能是他們有非常嵌套的屬性或什麼的。 – 2013-04-24 19:54:00

+0

好的。如何增加雲GAE上的堆棧? – membersound 2013-04-24 19:56:12