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.