JBoss-Anwendung soll im Singleton-Mode laufen

andisima

Mitglied
Hi,
ich bin nicht wirklich firm in der JBoss-Programmierung - und doch ist es mir gelungen eine JBoss-Anwendung zu schreiben, die ein Verzeichnis nach .zip-Files durchsucht, um diese dann in ein anderes Verzeichnis auszupacken. Diese JBoss-Anwendung habe ich in einem (der beiden laufenden JBosse) deployed - und siehe da: Es funktioniert(e)...

Nun hat man die JBoss-Umgebung jedoch leider geändert - und beide JBosse benutzen das gleiche deploy-Verzeichnis. Die Auswirkung auf meine JBoss-Anwendung: Sie läuft in beiden JBossen gleichzeitig - und ich bekomme ständig Fehlermeldungen, die besagen, dass eine Datei nicht mehr gefunden wurde (klar - sie wurde von meiner JBoss-Anwendung im anderen JBoss bereits ausgepackt...).

Nach intensiver Google-Befragung - und dem studieren diverser Artikel (bei den meisten verstehe ich leider nur Bahnhof) habe ich zwar herausgefunden, dass meine JBoss-Anwendung im Singleton-Mode laufen muss - hingekriegt habe ich es aber nicht.

Ich habe es als POJO mit der "@Service(objectName = "myexample:service=UnZipper")"-Annotation probiert - doch leider hat das nichts gebracht...

Leider finde ich aber keine verständlichen, simplen Beispiele...

Kann mir bitte jemand ein WRIKLICH simples Beispiel bringen, das in einem Clustered-JBoss nur einmal laufen würde?

Vielen Dank schon mal an alle!
 
Zuletzt bearbeitet:
Hi,
ich bin nicht wirklich firm in der JBoss-Programmierung - und doch ist es mir gelungen eine JBoss-Anwendung zu schreiben, die ein Verzeichnis nach .zip-Files durchsucht, um diese dann in ein anderes Verzeichnis auszupacken. Diese JBoss-Anwendung habe ich in einem (der beiden laufenden JBosse) deployed - und siehe da: Es funktioniert(e)...

Nun hat man die JBoss-Umgebung jedoch leider geändert - und beide JBosse benutzen das gleiche deploy-Verzeichnis. Die Auswirkung auf meine JBoss-Anwendung: Sie läuft in beiden JBossen gleichzeitig - und ich bekomme ständig Fehlermeldungen, die besagen, dass eine Datei nicht mehr gefunden wurde (klar - sie wurde von meiner JBoss-Anwendung im anderen JBoss bereits ausgepackt...).

Nach intensiver Google-Befragung - und dem studieren diverser Artikel (bei den meisten verstehe ich leider nur Bahnhof) habe ich zwar herausgefunden, dass meine JBoss-Anwendung im Singleton-Mode laufen muss - hingekriegt habe ich es aber nicht.

Ich habe es als POJO mit der "@Service(objectName = "myexample:service=UnZipper")"-Annotation probiert - doch leider hat das nichts gebracht...

Leider finde ich aber keine verständlichen, simplen Beispiele...

Kann mir bitte jemand ein WRIKLICH simples Beispiel bringen, das in einem Clustered-JBoss nur einmal laufen würde?

Vielen Dank schon mal an alle!

Aua... du hast keine Ahnung, sollst aber etwas relativ anspruchsvolles realisieren.

1. Anmerkung
Hier steht wirklich ganz genau wie es geht: Writing a Clustered HA Singleton Service - JBoss Community. Das solltest du hinbekommen oder die Finger davon lassen!

2. Anmerkung
Ohne die Theorie und die Spezifikationen zu kennen solltest du keine Enterpriseanwendungen realsieren, schon gar nicht in einer Clusterumgebung. Warum funktioniert eine EE Anwendung plötzlich nicht mehr? Weil der Zuständige sich mit EE nicht ausgekannt hat, die Spezifikationen nicht kennt und somit auch nicht berücksichtigt.

3. Anmerkung
Ich nehme an du meinst mit "JBoss Anwenung" einen Service und keine EJBs. In EJBs sind Fileoperationen verboten. Aber auch in einem Service (geclustert) sind Filezugriffe mit Vorsicht zu genießen. Wenn man um Filezugriffe nicht herumkommt, dann sollte man das über VFS machen. So wird hoffentlich verhindert, dass die Applikation nach einer (auch kleinen) Änderung an der Infrastruktur plötzlich wieder nicht funktioniert.
 
Zuletzt bearbeitet:
Vielen Dank für Ihre Antwort - der Link war sehr erfolgreich...

Zwischenzeitlich habe ich gelernt, dass ich einen Ressource-Adapter geschrieben habe :lol:

Ich habe einen Service daraus gemacht (war doch gar nicht so schwer) - und siehe da: Es funzt...

Für den Ressource-Adapter habe ich aber auch noch eine Lösung gefunden: Ich frage einfach via JMXConnector ab, ob der aktuelle JBoss der "Main"-JBoss ist. -Nur dann wird der Code ausgeführt...
 
Zwischenzeitlich habe ich gelernt, dass ich einen Ressource-Adapter geschrieben habe :lol:
Ressourceadapter ist eine konsistente und sinnvolle Lösung für Zugriffe auf das Filesystem. Ich empfehle trotzdem die Verwendung des VFS, welches mit neueren Versionen des JBoss eingeführt wurde.

Ich frage einfach via JMXConnector ab, ob der aktuelle JBoss der "Main"-JBoss ist. -Nur dann wird der Code ausgeführt...
Funktioniert das auch dann noch sinnvoll, wenn der Masterknoten heruntergefahren wird und ein anderer Knoten dessen Aufgabe übernimmt?
Eigentlich sorgt der Applicationserver dafür, dass ein clusterweiter Singletonservice genau einmal im Cluster aktiv läuft.
 
Hi,

ich habe es so gelöst:

Auszug aus meiner "ZIPExtractorAdapter.java:
Java:
	...

	private boolean isOnMasterRunning = false;

	...

	public void run() {
		try {
			initialize(zipExtractorConfig, getInPathList(), getOutPathList(), getFileCntList(), getFileMaskList());
		} catch (Exception e1) {
			logger.error("Illegal configuration values:" + e1.getMessage());
		}
		ZIPExtractor zipExtract = new ZIPExtractor(zipExtractorConfig);
		while (isRunning) {
			try {
				JMXServiceURL jmxUrl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:10033/jmxrmi");
				JMXConnector jmxConn = JMXConnectorFactory.connect(jmxUrl);
				if (null != jmxConn) {
					MBeanServerConnection mbsc = jmxConn.getMBeanServerConnection();
					ObjectName objectName = new ObjectName("jboss.ha:service=HASingletonDeployer");
					if ("true".equalsIgnoreCase(mbsc.getAttribute(objectName, "MasterNode").toString())) {
						if (!isOnMasterRunning) {
							isOnMasterRunning = true;
							logger.info("ZIPExtractor is now running on host: " + 
									InetAddress.getLocalHost().getHostName());
						}
						zipExtract.startScan();
					}
					else {
						if (isOnMasterRunning) {
							isOnMasterRunning = false;
							logger.info("ZIPExtractor is no more running on host: " +
									InetAddress.getLocalHost().getHostName());
						}
					}
				    jmxConn.close();
				}
				else {
					logger.error("No connection to JMX-Connector ("+jmxUrl.toString()+") possible!");
				}
				Thread.sleep(5000);
			} catch (Exception e) {
				logger.error("Error in run method: " + e); //.getMessage());
			}
		}
	}

	...

Ich habe es getestet: Sobald ein JBoss im Cluster heruntergefahren wird, übernimmt der andere JBoss die Arbeit - und ich bekomme die Ausgabe: "ZIPExtractor is now running on host: ...".

Der ZIPExtractor übernimmt dann auf dem "neuen" Master die Arbeit. :toll:

Habt Ihr noch Verbesserungsforschläge (außer einen Service im HASingleton schreiben - das werde ich als nächstes mal ausprobieren)?

VFS kenne ich überhaupt nicht... -muss mich da wohl mal schlau machen :rtfm:
 
Wow, dass das so funktioniert... Respekt! ;-)
Wie sieht es mit der Synchronisation zwischen den Knoten aus. Also wenn z.B. der Knoten heruntergefahren wird während du eine Datei verabeitest? Wird dann die Datei noch einmal oder gar nicht verarbeitet?

Ja, ein HASingletonService wäre eleganter, weil du dir die Abfrage sparst. Insgesamt könnte man die Abfrage über die Monitoringschnittstelle des JBoss sicher auch eleganter lösen. Du könntest dir den passenden Service injekten lassen (dann musst du ihn nicht suchen) und kannst dann das entsprechende Attribut abfragen.

Deine Variante tendiert dazu mit anderen (neueren) Versionen von JBoss nicht mehr zu funktionieren, weil doch sehr viel Internas hartcodiert sind.
 
Hi,

die Synchronisierung ist kein Problem: Die eigentliche .zip-Datei wird erst nach komplettem Auspacken aus dem Input-Verzeichnis gelöscht. Eine Weiterverarbeitung der ausgepackten Dateien startet erst dann, wenn eine im .zip-File vorhandene, das .zip-File beschreibende .xml-Datei vorhanden ist. Diese wird jedoch erst als letzte Datei entpackt...

Sollte also das Auspacken unterbrochen werden, so wird diese Datei im nächsten Durchlauf einfach noch einmal ausgepackt - und ggf. bereits ausgepackte Dateien einfach überschrieben. :bae:

Soweit ich weiß setzen wir die aktuellste JBoss-Version ein - Ich greife aber Deinen Einwand auf jeden Fall auf und realisiere das ganze noch als HASingletonService (jetzt habe ich Blut geleckt 😀).
 

Zurück
Oben