3 Stimmen

Concurrent access causes ClassCastException (X cannot be cast to X), or how to resolve such class loading problems in JBoss Gleichzeitiger Zugriff verursacht ClassCastException (X kann nicht in X umg

Ich habe ein Problem mit JBoss und dem Klassenladen.

Hier ist die Konfiguration, mit der ich arbeite. Ich habe zwei Instanzen von JBoss 4.2.3.GA auf demselben Server. Auf jeder Instanz läuft eine Anwendung, die miteinander kommuniziert. Es gibt eine Hilfsklasse, die in beiden Anwendungsarchiven enthalten ist. Diese Hilfsklasse ist in beiden Anwendungen streng identisch.

Das funktioniert normalerweise gut, aber in bestimmten Situationen bekomme ich einen ClassCastException. Der Fall ist wie folgt:

Ein Benutzer verwendet eine Webanwendung, die die Anwendung auf der ersten JBoss-Instanz aufruft (nennen wir sie Anwendung A). Und Anwendung A ruft die Anwendung B (auf der zweiten Instanz) auf. Dieser spezielle Aufruf dauert mehrere Sekunden, um erfolgreich zu sein.

Wenn ein anderer Benutzer versucht, die Webanwendung in einem ähnlichen Kontext zu verwenden (Aufruf von Anwendung A, die Anwendung B aufruft), und wenn dieser Aufruf während des ersten Benutzeraufrufs erfolgt, erhalte ich systematisch eine ClassCastException : X kann nicht in X umgewandelt werden (wobei X meine Hilfsklasse ist, die von beiden Anwendungen gemeinsam genutzt wird).

Ich habe einige Informationen gefunden und daraus geschlossen, dass es sich um ein Klassenladeproblem handelt. Tatsächlich wird meine Hilfsklasse in diesem bestimmten Kontext von verschiedenen Klassenladern geladen. Ich habe einen Druckbefehl platziert, um zu sehen, welcher Klassenlader verwendet wird. Bei normalem Verhalten wird org.jboss.mx.loading.UnifiedClassLoader3 zum Laden von Klassen verwendet. In dem oben beschriebenen speziellen Fall scheint Anwendung B einen anderen Klassenlader für den zweiten Benutzer zu verwenden. Mein Druckbefehl gab mir Folgendes zurück:

WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/----------> Elternklassenlader:java.net.FactoryURLClassLoader@de8209

Meine Vermutung ist, dass Anwendung B eine Instanz meiner Hilfsklasse zurückgibt, die von diesem WebappClassLoader geladen wurde, und Anwendung A (die UnifiedClassLoader3 verwendet) kann sie nicht umwandeln.

Aber ich verstehe nicht, warum der UnifiedClassLoader3 in diesem Fall nicht auf Anwendung B verwendet werden kann. Und warum wird dieser WebappClassLoader verwendet?

Alles, was ich über die Klassenladekonfiguration in meinen JBoss-Instanzen weiß, ist, dass Klassenladeisolierung verwendet wird und die folgende Konfiguration für beide Anwendungen verwendet wird:

  strict  
  applicationAorApplicationB.ear

Haben Sie einen Rat, um dieses Problem zu lösen? Wie kann ich den JBoss-Klassenlader konfigurieren, um diese ClassCastException zu vermeiden?

Ich möchte darauf hinweisen, dass kein Hot Deployment durchgeführt wird: Ich bereinige den Server jedes Mal, wenn ich die Anwendungen bereitstelle.

0voto

justkt Punkte 14360

Wenn JBoss für verschiedene Pakete unterschiedliche Klassenloader verwendet, folgt es tatsächlich dem Verhalten gemäß der Spezifikation. In vielen Versionen hat es das nicht getan. Sie können die Klassenladertrennung für WAR deaktivieren. Siehe die JBoss-Dokumentation für weitere Informationen.

Sie können auch eine Vielzahl von verschiedenen Methoden verwenden, die nicht erfordern, dass die Anwendungen im selben Klassenlader für die Kommunikation sind, und dies würde Ihre Anwendungen spezifikationskonformer machen. Siehe diese Stackoverflow-Frage für weitere Details.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X