2011-06-20 4 views
1

Je suis avec un problème qui s'étend sur plus de 2 jours. Lorsque j'échange des messages entre acteurs, j'accuse le débordement de la pile JVM.Akka - StackOverflowError pendant la sérialisation des objets

Mon message est un objet avec de nombreux liens (plus de 10000 objets enfants reliés entre eux dans une liste chaînée). A savoir, un objet avec des relations Neo4J.

L'erreur est la suivante:

java.lang.StackOverflowError 
    at java.io.Bits.putLong(Bits.java:108) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.writeLong(ObjectOutputStream.java:1928) 
    at java.io.ObjectOutputStream.writeLong(ObjectOutputStream.java:788) 
    at java.util.Date.writeObject(Date.java:1303) 
    at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 

Quelqu'un at-il une solution pour cela?

grâce

+1

Peut-être que vous devriez ajouter les balises neo4j et java pour attirer l'attention de plus de gens ... – Christian

+0

@Christian merci, je le ferai – ricardogobbo

+0

Pourriez-vous s'il vous plaît élaborer sur votre structure de données? IMHO Neo4j-Les relations ne sont pas sérialisables car ce sont des objets connectés connectés à une base de données graphique. Vous pouvez simplement stocker leurs identifiants, mais le magasin de graphes à l'autre extrémité doit être exactement synchronisé avec celui d'origine. –

Répondre

3

Utilisez-vous java.util.LinkedList ou une liste personnalisée personnalisée? Si c'est le cas, vous devez écrire une méthode writeObject() personnalisée pour éviter la récursion qui aurait lieu si vous n'en aviez pas.

+0

Je n'implémente aucune structure de données. J'utilise seulement des collections de scala. – ricardogobbo

+0

@ricardogobbo OK, vous devez donc regarder en bas de la trace de la pile pour voir quelles classes sont impliquées dans cette récurrence apparente, et publier cette information ici. – EJP

+0

Je crois que c'est la solution. J'ai réalisé qu'il y a des liens qui ressemblent à LinkedList. En d'autres termes, j'ai compris ce que vous disiez xD. Test maintenant! – ricardogobbo

-1

Le candidat probable du problème est un objet qui a une référence à lui-même. Compte tenu de votre expression du domaine, je soupçonne qu'un enfant a une liste liée qui comprend lui-même, ou une référence cyclique. C'est-à-dire que l'un des nœuds auquel il est lié possède à son tour un lien.

+0

Salut, ça n'arrive pas, j'ai beaucoup révisé avant de poster ma question. L'objet est lié entre eux comme une traînée de points géoréférencés du point précédent et du point suivant. Le premier point n'a pas de point avant, et le dernier point n'a pas de point suivant. – ricardogobbo

+0

Cette réponse est incorrecte. Les graphiques d'objets cycliques sont spécialement gérés par sérialisation. Plus précisément, ils ne provoquent pas de récursivité. – EJP

+0

Alors, quel est le problème sachant qu'il n'y a toujours pas de récursivité entre les objets? – ricardogobbo

Questions connexes