# [JBoss5] JBoss stoppen bzw. am starten hindern?



## Verjigorm (31. Aug 2011)

Hallo,

folgendes Problem:

Wir haben eine Klasse mit @Service annotiert, die als erstes vom JBoss 5.1.0 gestartet wird, vor allen anderen Beans. Dieser Service checkt verschiedene Bedingungen die erfüllt sein müssen, z.B. Versionen etc.

Sollte es in bestimmten Fällen dazu kommen, dass unsere Anwendung nicht starten soll, dann würde ich gerne den JBoss herunterfahren, bzw. das (weiter-)deployen der Anwendung verhindern.

Um den JBoss zur Laufzeit zu stoppen benutzen wir folgenden Code:


```
final MBeanServer locateJBoss = MBeanServerLocator.locateJBoss();
			final ObjectName kernel = new ObjectName("jboss.system:type=Server");
			locateJBoss.invoke(kernel, "shutdown", new Object[] {}, null);
```

Dies funktioniert auch gut, aber in diesem Fall gibt es eine Exception mit dem Text "not started".

Wie hindere ich den JBoss nun daran zu starten, bzw. wie stoppe ich ihn?
Weder eine RuntimeException noch System.exit scheinen zu wirken (War nur zu Testzwecken  )

mfg Verjigorm


----------



## maki (31. Aug 2011)

Bin kein JBoss Profi, aber es überrascht mich kein bisschen, dass System.exit etc nicht funzen, wäre auch katastrophal, wenn eine EJB/App den ganzen Server herunterfahren dürfte.

Ich denke du willst zuviel, deine EJB/App nicht zu starten ist dein gutes recht, den Server abzufackeln nicht


----------



## Verjigorm (31. Aug 2011)

Das mit System.exit leuchtet mir ja auch ein, keine Frage 

Aber wie hindere ich den Rest meiner Applikation am starten?


----------



## maki (31. Aug 2011)

Was ist denn das eigentliche Ziel?

Deine App wird ja an sich nicht funzen wenn deine EJBs nicht starten, oder?
Wer (User, Admin, etc. pp.) startet eigentlich den JBoss?


----------



## Verjigorm (31. Aug 2011)

maki hat gesagt.:


> Was ist denn das eigentliche Ziel?



Wenn Versionskonflikt, dann soll die Applikation nicht starten. ist doch ganz einfach zu verstehen oder???



maki hat gesagt.:


> Deine App wird ja an sich nicht funzen wenn deine EJBs nicht starten, oder?



Die EJB's starten ja doch, genau das will ich ja verhindern ......



maki hat gesagt.:


> Wer (User, Admin, etc. pp.) startet eigentlich den JBoss?



Fast genau in dieser Reihenfolge  Jeder x-beliebige halt, mitunter auch irgendwelche Scheduler etc.


----------



## maki (31. Aug 2011)

> Wenn Versionskonflikt, dann soll die Applikation nicht starten. ist doch ganz einfach zu verstehen oder???


IMHO noch zu wenig, war meine Frage zu kompliziert? 
Dachte die wäre recht einfach zu verstehen...

Werden bei euch zufällig bzw. wahllos verschiedene Versionen der App auf dem Server installiert?

Hast du mal daran gedacht die Serial UID für sowas zu nutzen? Sollte recht schnell knallen dann.

Ich habe den Eindruck dass euer Deploy Prozess "suboptimal" ist und ihr das nun per Frickelei "lösen" wollt, nciht böse gemeint.


----------



## Verjigorm (31. Aug 2011)

maki hat gesagt.:


> IMHO noch zu wenig, war meine Frage zu kompliziert?
> Dachte die wäre recht einfach zu verstehen...



Unsere Applikation ist in "Module" aufgeteilt. Jedes Modul besitzt eine Version, die im Source hinterlegt ist. Diese Version muß ein passendes Gegenstück in der Kundendatenbank besitzen. Dies wird momentan zur Laufzeit ermittelt. 

Momentan wird diese Versionsprüfung zur Laufzeit ermittelt. Im Fehlerfall gibt es halt eine Fehlermeldung/Log-Eintrag/E-Mail was auch immer.

Nun ist es schon vorgekommen, dass der JBoss installiert und/oder gestartet, aber vorerst nicht benutzt wird. Den Versionskonflikt merkt man erst bei der Benutzung.
Damit dies aber schon beim Start des JBoss "erkannt" wird, brauchen wir nun eine Prüfung beim Start des JBoss.
Und die Anforderung lautet u.a.:
Wenn es ein Versionskonflikt gibt, dann den JBoss nicht zu stoppen bzw. nicht zu starten.

Versionskonflikt -> Applikation nciht starten. Finde ich extrem einfach die Aussage.
In meiner letzten Firma haben wir OSGI benutzt, da war das deregistrieren von Bundles ganz einfach. Sowas möchte ich hier auch.


----------



## RaiausderDose (1. Sep 2011)

Also "wir" nutzen auf der Arbeit Linux und JBoss ist als Server eingerichtet, da der manchmal nach diversen Deploys irgendwie bei der Speicherverwaltung Mist baut, müssen die Admins ihn manchmal weghauen oder rebooten.

Machen dies über eine Webapp und zwar so:


```
Runtime rt = Runtime.getRuntime();
     //rt.exec("//sbin//shutdown -r now"); //<--Ganzer Server rebooten!!!!
     rt.exec("service jboss restart"); //<-- nur JBOSS rebooten!
```

Dazu muss der JBOSS Server aber als root laufen, klar Sicherheitsrisiko (bei uns eher geringes Problem, da er nur intern genutzt wird), aber du hast sonst, meines Wissens nach, keine Chance.


----------



## TheDarkRose (1. Sep 2011)

RaiausderDose hat gesagt.:


> Dazu muss der JBOSS Server aber als root laufen, klar Sicherheitsrisiko (bei uns eher geringes Problem, da er nur intern genutzt wird), aber du hast sonst, meines Wissens nach, keine Chance.



Wieso sollte der JBoss als Root laufen? Wenn das Initskript, bzw der Upstart Service für JBoss auf für alle Executable ist, kann dieser von jedem gestartet werden und läuft auch dann auch in diesem Benutzerkontext.


----------



## FArt (9. Sep 2011)

Rein technisch: der Aufruf des System-MBeans macht auch nur ein System.exit(). Die Finalisierung wird dann über Shutdown-Hooks durchgeführt (siehe Sourcecode).
Also kann man auch selber ein System.exit durchfürhren.. natürlich sollte man davon absehen.

Auch das Shutdown-Skript spricht genau diese Schnittstelle des Servers an. Natürlich muss der JBoss deswegen nicht als root laufen.

Eine saubere Lösung wäre OSGI oder ein geregeltes Deployment. Alles andere ist gefrickel. Wenn dein erstes Bean alle Abhängigekeite und Kompatibilitäten prüfen kann, dann soll es das tun. Wenn sonst alle Deployments davon abhängen, wird nichts mehr deployt. Aber auch das ist ... suboptimal... freundlich ausgedrückt...


----------

