Dyn. Nachladen von veränderten Klassen in Multiprozesssystem

Status
Nicht offen für weitere Antworten.

babuschka

Top Contributor
Hallo zusammen

Ich habe hier eine kleine aber feine Problemstellung. Prof. Meixner meinte dazu, "Ein nicht triviales Problem".

Es geht um folgendes:
Wir haben drei Klassen A, B und C. Jede dieser Klassen besitzt Attribute mit allen erlaubten Modifiern und stellt Methoden bereit.
A hat wie auch C eine Referenz auf ein B-Objekt. (die _gleiche_ Referenz)
A hat zusätzlich eine Referenz auf ein C-Objekt.
B hat eine Referent auf ein C-Objekt.
Java:
A ---> B <---> C
|              ^
|              |
+--------------+
Nun gibt es _zwei_ Prozesse P1 und P2 (zwei main-Threads, nicht zwei Threads in einer main), die beide auf die Klassen zugreifen.
P1 -> A, B
P2 -> B, C
=> B wird in beiden Prozessen per implizitem ClassLoading geladen und verwendet.

Nun zum Problem:
B wird verändert (Methode löschen, ändern, hinzufügen, usw.).
Wie ist es möglich B in die _laufenden_ Prozesse einzuschleusen? Was passiert mit den bestehenden Referenzen in A und C auf B? Müssen A und C auch neu geladen werden?
Und zuletzt wie realisiert man dieses Szenario?


Lösungsansatz:
URLClassLoader verwenden. (hab ehrlich gesagt nicht zu 100% verstanden, was er bringt)
In diesem Buch [OpenBook: Java ist auch eine Insel] wird eine ähnliche Problematik angesprochen. Sie hilft _mir_ nur leider nicht weiter.


Ich würde mich freuen, wenn ihr mir helfen könntet.

Mit freundlichen Grüßen
Jojo
 

Noctarius

Top Contributor
Wenn du Interfaces injectest anstatt den festen Implementierungen kannst du Implementierungen zur Laufzeit neu laden und auf das Interface zurückcasten.
 

babuschka

Top Contributor
@oldshoe
Dumme Frage, aber was sind "Semaphoren" ?

@Noctarius
Ja klar verwende ich Interfaces. Aber ich möchte nicht, wenn ich eine Klasse ändere gleich ihren Namen ändern. Das wäre zwar eine simple Lösung den veränderten Namen per Configreload zu injezieren und anschließend per Refelection die neue Klasse zu erstelle, aber ehrlich gesagt ... find ichs nicht schön :-(
Oder hast du dir das anders vorgestellt ?
 

babuschka

Top Contributor
sonst wird sie doch nicht mehr neu geladen...

Ich änder in der Factory-Klasse den Namen der Klasse, die sie erstellt und somit muss auch die Klasse umbenannt werden ...

Oder wie hast du dir das gedacht ?
 

Noctarius

Top Contributor
Sicher kannst du sie jederzeit neu laden. Du schmeisst den alten URLClassLoader weg, nimmst nen neuen, lädst die Klasse neu.

Deswegen ja ClassLoader1.Foo != ClassLoader2.Foo

Aber da du immer auf das Interface zurückcasten kannst benutzt du die neue Klasse ganz normal weiter.
 

babuschka

Top Contributor
okay ...

Dann werd ich mir mal das mit dem URLClassLoader genauer anschauen. Falls sich weitere Fragen auftun, werd ich wieder vorbeischauen.

Mir ist nur etwas unklar was passiert, wenn ich ein Interface ändere.
 

Noctarius

Top Contributor
Ein Interface kannst du nicht ändern, da das Interface vm Standardclassloader geladen werden muss, sonst steht es hinterher nicht mehr zur Verfügung.
 

babuschka

Top Contributor
Also ist das System auf Klassen eingeschränkt, die Interfaces implementieren, nie direkt sondern nur über Interfaces angesprochen werden und nicht vom Standard-ClassLoader geladen werden können ?
 

babuschka

Top Contributor
Siehst du eine Möglichkeit diese Einschränkungen zu minimieren ?
Zumindest soweit, dass man auch Interfaces "HotSwap"-en kann.

Ich habe mir gerade ein kleines Testprogramm zusammengebaut.
Wenn ich die Klasse B lade und auf ein Interface casten will ...
ClassCastException

Das Beispiel zum Testen kommt gleich ;9
 

Noctarius

Top Contributor
Jein. Du kannst das System natürlich ausdehnen:

SystemClassLoader -> ApplicationClassLoader (Standard) -> InterfaceClassLoader (läd die Interfaces) -> ImplementationClassLoader

Mit so einer Hierarchie kannst du auch die Interfaces neuladen, Musst allerdings dann alle dahinter liegenden Implementierungen auch "aktuallisieren".

Zeig mal deinen Beispielcode.
 

babuschka

Top Contributor
Beispielcode
Java:
// Interface C
public interface C { }

// Class B
public class B implements C {
	static {
		System.out.println("Loading B:");
		System.out.println("Loader = " + B.class.getClassLoader().getClass().getName());
		System.out.println();
	}
}

// Tester
public class Tester {
	public static void main(String[] args) throws Exception {
		URL u = (new File("bin/")).toURI().toURL();
		URLClassLoader loader = new URLClassLoader(new URL[] {u}, null);
		
		Class<?> clazz = loader.loadClass("misc.B");
		C c = (C) clazz.newInstance();
	}
}

Das Ergebnis bei mir ist:
Java:
Loading B:
Loader = java.net.URLClassLoader
UID = 2

Exception in thread "main" java.lang.ClassCastException: misc.B cannot be cast to misc.C
	at process.Process.main(Process.java:16)
 

babuschka

Top Contributor
Hab ich auch schon ausprobiert.
Also im Prinzip das ", null" rauslöschen -> AppClassLoader wird als Parent genommen.
Dann wird die Klasse nur einmal geladen.
-> Cast funktioniert aber

Allerdings läd jetz der AppClassLoader die Klasse.
-> Ist aber auch logisch. Er darf ja _vor_ dem URLCL arbeiten.


Nochmal zurück zum Problem:
Wie du vorhin schon geschrieben hast müsste ich mein System ausweiten um auch Interfaces nachladen zu können. Genau das brauche ich.
Das System um das es sich hier handelt ist folgendes.

Das Programm wird entwickelt. Es entstehen mehrere hundert Klassen.
Um eine bessere Skalierbarkeit zu erhalten wird das Programm in Prozesse aufgeteilt. Jeder Prozess kann beliebige Klassen verwenden. Es gibt einen Wächterprozess, der alle Prozesse ansprechen und Befehle übermitteln kann.
Einer der Befehle wird sein:
Java:
Reload de.xxx.yyy.misc.B

Wenn nun eine beliebige Änderung am Programm vorgenommen wird, loggt man sich beim Wächter ein und schickt die "Reload"-Befehle an alle Prozesse, die registriert sind.
Somit sollten Änderungen on-the-fly in das laufende System injiziert werden können.

Wichtig ist, dass es wirklich _beliebige_ Änderungen sein sollen.
 
M

maki

Gast
Schon mal was von OSGi gehört?
Oder muss es eine Eigenentwicklung sein?
 

babuschka

Top Contributor
sodala

Mein Prof hat mir gerade einen Tipp gegeben.
JBoss.

Hast du da auch ähnliche Infos wie zu OSGi ?
Ansonsten würd ich mich mal auf die Suche begeben.
 

Noctarius

Top Contributor
Also wenn du dich schon in irgendwas einarbeiten magst würde ich ServiceMix empfehlen anstatt JBoss :) Ich mag die SpringDM Integration.

Aber gleich zu Anfang OSGi hat eine sehr steile Lernkurve, die gilt es vorab zu erklimmen. Hast du das einmal geschafft wird es mit der Zeit immer einfacher. Aber die ersten Dinge sind echt hart zum Laufen zu bewegen. Wobei neue Projekte immer schneller gehen als bestehende zu wrappen wie ich es musste :D
 

Noctarius

Top Contributor
ServiceMix ist OSGi mit Spring (DM) Integration, was den Einstieg in OSGi um LÄngen vereinfachen kann. Daher würde ich immer entweder direkt den SpringDM Server von SpringSource oder alternativ den auf Felix (eine OSGi Implementierung von Apache) basierenden ServiceMix (mein Favorit) benutzen. Gerade beim Einstieg.

OSGi Grundwissen / -verständnis brauchst du aber trotzdem. Hier sind aber genug Leute die dir beim Einstieg in OSGi beistehen können, weil ohne Menthor ist das extrem schwer (finde ich).
 

babuschka

Top Contributor
Evtl. "dumme" Frage:
Du bist dir sicher, dass SpringDM oder Felix den, von meinem Prof. vorgeschlagenen JBoss, ersetzen kann?

Wärst du bereit mich ein wenig beim Einstieg in OSGi zu unterstützen?
 

Noctarius

Top Contributor
JBoss ist ein EJB Server, während SpringDM und ServiceMix die EJB Spezifikation nur bedingt unterstützen (mit richtigem OSGi Bundle). SpringDM und ServiceMix bieten dir grundlegend einen OSGi Kern mit einigen bereits mitgelieferten Features, z.B. einem MessageBus, Routingdienste und ähnlichen. Bei beiden werden die Spring Dynamic Modules unterstützt (daher heißt auch der SpringSource Server SpringDM) welche versuchen viel interna des OSGi nach Außen hin ein wenig zu kapseln und zu vereinfachen.

Mit dem passenden Maven Plugin (z.B. dem Felix Bundler oder dem von SpringSource) geht ein einfaches TestBundle auch fix von der Hand, zumal man dank Spring Unterstützung nahezu jedes Springbean OSGifizieren kann.

Felix selbst ist kein "Server" sondern eine OSGi Implementierung wie z.B. auch Equinox, welches unter Eclipse sein Werk verrichtet.

Auf was der JBoss basiert bin ich mir jetzt nicht mal ganz sicher, ich meine der benutzt auch Equinox, würde mich aber nicht darauf versteifen.

Zum Thema "In OSGi einarbeiten":
Ich würde sagen wenn Fragen auftreten immer allgemein im Forum fragen, hier gibt es genug Leute die täglich mit OSGi kämpfen (sorry wildcard *gg*). Also Fragen solltest du immer recht zügig beantwortet bekommen. Ich selbst habe vor etwa 6-8 Wochen angefangen mich stärker mit OSGi zu beschäftigen, hatte aber eben nen Kollegen der da schon etwas länger dran rumkämpfte und den ich immer fragen konnte wenn es zwickte.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
C Klassen Class Files nachladen (mehrer .jar Dateien) Java Basics - Anfänger-Themen 2
G JAR zur Laufzeit nachladen Java Basics - Anfänger-Themen 2
G Klasse dynamisch nachladen: Fehler Java Basics - Anfänger-Themen 9
W Klassen [GELÖST] Objekte während der Laufzeit mit neuen veränderten Werten beliebig oft initialisieren Java Basics - Anfänger-Themen 2
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
E Klassen implementieren Java Basics - Anfänger-Themen 94
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
L Wie teilt man ein Programm in vernünftige Klassen ein? Java Basics - Anfänger-Themen 10
T Klassen Denkfehler im Klassen "dynamisch" instanzieren? Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
A Methode, Klassen Java Basics - Anfänger-Themen 3
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
J Zwei Klassen die sich gegenseitig referenzieren - Bad practice? Java Basics - Anfänger-Themen 4
G Klassen und Objekte Java Basics - Anfänger-Themen 2
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
D Klassen ausgeben Java Basics - Anfänger-Themen 2
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
G Refactoring von mehreren identischen Klassen Java Basics - Anfänger-Themen 36
O Wrapper Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben