2011-01-14 7 views
0

Ich bekomme diese Reihe von Ausnahmen von Zeit zu Zeit beim Ausführen meiner Anwendung im gehosteten Modus in Eclipse. Was daran merkwürdig ist, ist, dass es nicht konsequent passiert. Dies passiert gelegentlich nach dem Neukompilieren und Neustarten der Anwendung. Beim Neustart von Eclipse wird es oft gelöscht (ohne Code-Änderung). Hat jemand irgendwelche Gedanken darüber, was hier vor sich geht? Oder sogar wo ich anfangen würde zu suchen?Wie starte ich das Debuggen dieser JDO-Ausnahme?

 
[ERROR] javax.servlet.ServletContext log: Exception while dispatching incoming RPC call 
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract com.grgcomponents.coatl.client.auth.TwitterUser com.grgcomponents.coatl.client.auth.TwitterLoginService.getLoggedInUser(java.lang.String) throws java.lang.IllegalArgumentException' threw an unexpected exception: java.lang.UnsupportedOperationException 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:378) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:581) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:207) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:243) 
    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.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58) 
    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 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 
    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.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349) 
    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.content(HttpConnection.java:938) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: java.lang.UnsupportedOperationException 
    at org.datanucleus.store.appengine.EntityUtils.getPropertyName(EntityUtils.java:62) 
    at org.datanucleus.store.appengine.DatastoreFieldManager.getPropertyName(DatastoreFieldManager.java:1073) 
    at org.datanucleus.store.appengine.DatastoreFieldManager.fetchObjectField(DatastoreFieldManager.java:309) 
    at org.datanucleus.store.appengine.DatastoreFieldManager.fetchLongField(DatastoreFieldManager.java:429) 
    at org.datanucleus.state.AbstractStateManager.replacingLongField(AbstractStateManager.java:1148) 
    at com.grgcomponents.coatl.server.persisted.TwitterOAuthTokens.jdoReplaceField(TwitterOAuthTokens.java) 
    at com.grgcomponents.coatl.server.persisted.TwitterOAuthTokens.jdoReplaceFields(TwitterOAuthTokens.java) 
    at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772) 
    at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791) 
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:480) 
    at org.datanucleus.state.JDOStateManagerImpl.validate(JDOStateManagerImpl.java:4263) 
    at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2444) 
    at org.datanucleus.jpa.EntityManagerImpl.find(EntityManagerImpl.java:234) 
    at org.datanucleus.store.appengine.jpa.DatastoreEntityManager.find(DatastoreEntityManager.java:56) 
    at com.grgcomponents.coatl.server.auth.TwitterLoginServiceImpl.getCurrentUser(TwitterLoginServiceImpl.java:45) 
    at com.grgcomponents.coatl.server.auth.TwitterLoginServiceImpl.getLoggedInUser(TwitterLoginServiceImpl.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:562) 
    ... 30 more 


[ERROR] javax.servlet.ServletContext log: Exception while dispatching incoming RPC call 
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String com.grgcomponents.coatl.client.preferences.UserSettingsService.getSetting(java.lang.String,java.lang.String)' threw an unexpected exception: java.lang.UnsupportedOperationException 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:378) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:581) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:207) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:243) 
    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.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58) 
    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 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 
    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.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349) 
    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.content(HttpConnection.java:938) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreacom.google.gwt.user.client.rpc.StatusCodeException: 500 The call failed on the server; see server log for details 
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:192) 
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287) 
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157) 
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326) 
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207) 
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126) 
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561) 
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269) 
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91) 
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java) 
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157) 
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281) 
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531) 
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352) 
    at java.lang.Thread.run(Thread.java:680) 
dPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: java.lang.UnsupportedOperationException 
    at org.datanucleus.store.appengine.EntityUtils.getPropertyName(EntityUtils.java:62) 
    at org.datanucleus.store.appengine.DatastoreFieldManager.getPropertyName(DatastoreFieldManager.java:1073) 
    at org.datanucleus.store.appengine.DatastoreFieldManager.fetchObjectField(DatastoreFieldManager.java:309) 
    at org.datanucleus.store.appengine.DatastoreFieldManager.fetchLongField(DatastoreFieldManager.java:429) 
    at org.datanucleus.state.AbstractStateManager.replacingLongField(AbstractStateManager.java:1148) 
    at com.grgcomponents.coatl.server.persisted.TwitterOAuthTokens.jdoReplaceField(TwitterOAuthTokens.java) 
    at com.grgcomponents.coatl.server.persisted.TwitterOAuthTokens.jdoReplaceFields(TwitterOAuthTokens.java) 
    at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2772) 
    at org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:2791) 
    at org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:480) 
    at org.datanucleus.state.JDOStateManagerImpl.validate(JDOStateManagerImpl.java:4263) 
    at org.datanucleus.ObjectManagerImpl.findObject(ObjectManagerImpl.java:2444) 
    at org.datanucleus.jpa.EntityManagerImpl.find(EntityManagerImpl.java:234) 
    at org.datanucleus.store.appengine.jpa.DatastoreEntityManager.find(DatastoreEntityManager.java:56) 
    at com.grgcomponents.coatl.server.UserUtil.getTwitter(UserUtil.java:40) 
    at com.grgcomponents.coatl.server.UserUtil.getUserSetting(UserUtil.java:62) 
    at com.grgcomponents.coatl.server.preferences.UserSettingsServiceImpl.getSetting(UserSettingsServiceImpl.java:14) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:562) 
    ... 30 more 

Hier ist die Klasse, die ich anhalten bin versucht:

package com.grgcomponents.coatl.server.persisted; 

import javax.persistence.Entity; 
import javax.persistence.Id; 

@Entity 
public class TwitterOAuthTokens { 
@Id 
private String loginManagerCookie; 

private String requestTokenKey; 

private String requestTokenSecret; 

private String userToken; 

private String userTokenSecret; 

private long lastUsed; 

public String getLoginManagerCookie() { 
    return loginManagerCookie; 
} 

public void setLoginManagerCookie(String loginManagerCookie) { 
    this.loginManagerCookie = loginManagerCookie; 
} 

public String getUserToken() { 
    return userToken; 
} 

public void setUserToken(String userToken) { 
    this.userToken = userToken; 
} 

public String getUserTokenSecret() { 
    return userTokenSecret; 
} 

public void setUserTokenSecret(String userTokenSecret) { 
    this.userTokenSecret = userTokenSecret; 
} 

public String getRequestTokenKey() { 
    return requestTokenKey; 
} 

public void setRequestTokenKey(String requestTokenKey) { 
    this.requestTokenKey = requestTokenKey; 
} 

public String getRequestTokenSecret() { 
    return requestTokenSecret; 
} 

public void setRequestTokenSecret(String requestTokenSecret) { 
    this.requestTokenSecret = requestTokenSecret; 
} 

public long getLastUsed() { 
    return lastUsed; 
} 

public void setLastUsed(long lastUsed) { 
    this.lastUsed = lastUsed; 
} 

} 

Hier ist der Aufruf, das auftritt, in getTwitter (String), und der Fehler am letzten (Wir geben andernfalls erscheint tatsächlich zu Leitung:

public static Twitter getTwitter(String loginManagerId) 
{ 
    if(loginManagerId == null) 
     return null; 

    EntityManager em = CoatlEntityManagerFactory.getDefault() 
      .createEntityManager(); 

    return getTwitter(loginManagerId, em); 
} 

public static Twitter getTwitter(String loginManagerId, EntityManager em) 
{ 
    if(loginManagerId == null) 
     return null; 

    TwitterOAuthTokens storedTokens = em.find(TwitterOAuthTokens.class, 
      loginManagerId); 
+0

Benutzer führt eine Operation aus (unbekannt) und erhält eine Ausnahme. Das gibt den Menschen kaum einen Zusammenhang, um zu erraten, wo das Problem liegt. – DataNucleus

+0

Ja, ich weiß. Und wenn ich mehr Informationen hätte, würde ich es geben. Alles was ich habe ist, dass dies passiert, wenn ich find() zum ersten Mal im Datenspeicher ausführe. Wenn es einmal passiert, passiert es jedes Mal, wenn ich danach auf den Datenspeicher zugreife. Wenn der erste Datenspeicherzugriff erfolgreich ist, werde ich nie ein Problem haben. Neustart von Eclipse wird es etwa drei Viertel der Zeit beheben. – Curtis

+0

Denkst du nicht, dass das Posten der Klasse "mehr Informationen" wäre, oder vielleicht den Persistenzcode (das "Finden")? – DataNucleus

Antwort

1

Dies ist ein sporadischer Fehler, der von Zeit zu Zeit auf jeder persistierbar Klasse passiert, aber um so mehr auf denjenigen, die eine Menge parallel verwendet werden, es in JDO und JPA geschieht, und es scheint, als ob. Der lokale Datenspeicher sperrt eine bestimmte Tabelle/Entitätsgruppe und vergisst die Freigabe. Dies führt dazu, dass alle nachfolgenden Aufrufe von DS-Operationen fehlschlagen. Im Allgemeinen muss ich Eclipse nicht neu starten; Wenn der Server gestoppt wird und der Server gestartet wird, neigt er dazu, das Problem zu beheben. Wenn nicht, wird ein vollständiger Refresh/Clean-Build den Zweck erfüllen.

Die einzige wirkliche Lösung scheint darin zu bestehen, die get() - oder put() -Aufrufe in einen synchronisierten Codeblock zu stellen, was theoretisch sicherstellt, dass immer nur ein Thread auf Ihre Entitäten zugreift. http://code.google.com/p/datanucleus-appengine/issues/detail?id=203

+0

Ich werde es versuchen. Vielen Dank! – Curtis