[java] hoe programma netjes afsluiten ?

Pagina: 1
Acties:
  • 333 views sinds 30-01-2008
  • Reageer

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Ik ben bezig met het modelleren van een multithreaded server, die 24/7 gaat draaien.

Af en toe moet deze down voor upgrades/onderhoud/andere machine.

Hoe kan ik ervoor zorgen dat ik mijn programma (wat niet aan een console hangt) een commando kan geven om af te sluiten ?

Met andere woorden:
hoe spreek ik een java programma aan dat niet aan een console hangt ?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je bedoelt dat de applicatie als een soort service draait, zonder GUI?

De makkelijkste oplossing is dan om gewoon op een Socket te gaan luisteren naar commando's. Dat is de enige manier om remote commando's binnen te krijgen zonder een console of GUI. Als reactie daarop kan je dan je threads beeindigen (liefst vragen te eindigen).

Verder kan je eventueel nog wat doen met Runtime.getRuntime().addShutdownHook(Thread) als dat nodig is.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • B-Man
  • Registratie: Februari 2000
  • Niet online
inderdaad, de applicatie draait als service, zonder GUI.

Ik dacht er inderdaad al over om te gaan luisteren op een bepaalde poort, maar was benieuwd of er een simpeler alternatief is.

Ik zou natuurlijk ook met RMI kunnen werken, en een simpele class schrijven die mbv RMI een functie aanroept in mijn programma...

Wat betreft het afsluiten van de applicatie: er zijn een aantal daemon threads, en een enkele user thread. De user thread blijft in de lucht mbv een while loop die een boolean var controleert. Mbv een public shutdown functie is deze boolean var op false te zetten, waardoor de user thread netjes eindigt/stopt. Voordat deze shutdown functie ervoor zorgt dat de user thread stop, worden eerst alle daemon threads netjes afgesloten (ik heb voor iedere daemon thread een methide shutdown() geimplementeerd die netjes alle gegevens wegschrijft).

Ik wil eigenlijk net zoiets maken als de scripts die je onder linux in /etc/rc.d/init.d/ ziet staan. Een script dat je aanroept met "start | stop | status". Ik zag dat Tomcat ook op deze manier werkt, en heb de sources bekeken, maar werd er niet echt veel wijzer van.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Precies, gewoon laten luisteren naar een socket. Nu denk je misschien, argh, beveiligings risico!!

Je kan ook alleen connecties vanaf de localhost accepteren of met een SSL socket werken. Waar het op neer komt is dat je een shutdown tooltje maakt. Dit tooltje connect naar je server en activeert je shutdown code. Dat dus netjes alle threads afgesloten worden, alle files weer sluit en alle client connecties netjes afgesluit.

Je kan zover gaan dat je de shutdown gaat schedulen. Dat dus over een uur de server plat gaat en dat je client connecties om de 15 minuten een melding krijgen dat de server over x tijd plat gaat. Wel zo lief, stel dat een client net midden in iets is en in eenkeer de melding krijgt dat de connectie weggevallen is.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
B-Man: Ik dacht er inderdaad al over om te gaan luisteren op een bepaalde poort, maar was benieuwd of er een simpeler alternatief is.
Volgens mij dus niet :) .
Ik zou natuurlijk ook met RMI kunnen werken, en een simpele class schrijven die mbv RMI een functie aanroept in mijn programma...
Klopt, werkt makkelijker en fraaier, maar is wel iets zwaarder. Zelf gebruik ik wel RMI om te zorgen dat een applicatie maar 1 keer wordt gestart, werkt buitengewoon fraai en makkelijk.
Wat betreft het afsluiten van de applicatie
Met lof! :*
Een script dat je aanroept met "start | stop | status"
Dat kan je dus gewoon met een socket doen zoals je zelf beschreef (of met RMI uiteraard).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op zondag 14 oktober 2001 15:32 schreef mbravenboer het volgende:

[..]

Volgens mij dus niet :) .
[..]

Klopt, werkt makkelijker en fraaier, maar is wel iets zwaarder. Zelf gebruik ik wel RMI om te zorgen dat een applicatie maar 1 keer wordt gestart, werkt buitengewoon fraai en makkelijk.
[..]

Met lof! :*
[..]

Dat kan je dus gewoon met een socket doen zoals je zelf beschreef (of met RMI uiteraard).
Ik zou gewoon via een socket werken, is het simpelst en minst ingewikkeld. Met RMI moet je van allerlij kleine dingetjes eromheen doen. Niet moeilijk ofzo, maar wel allemaal dingen die je moet doen en dus kunt vergeten als je de server opstart.

Je zou dat commando verhaal zelfs zo bruut kunnen doen dat je een tooltje hebt die je command line argument (start | stop | shutdown) rechtstreeks over de socket naar je server stuurt (via een Object stream). Vervolgens doet je server er wat mee en knalt een string terug via een Object stream. Deze string geef je direct weer in je tooltje. Dan hou je alles server side en heb je in weze alleen een programma dat 1 string stuurt naa je server en 1 string ontvangt van de server.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Heb je op zich wel gelijk in als je RMI niet kent. Het is toch ff een drempel en behoorlijk wat bestuderen. Als je het kent is het echter wel erg leuk :) .

Het is natuurlijk wel cool als je alle zaken gewoon via OO kan regelen zoals bijv:
code:
1
2
3
4
5
6
7
8
public interface Service extends Remote
{
    public Status getStatus()           throws RemoteException;

    public void restart()               throws RemoteException;
    public void stop()                  throws RemoteException;
    public void stop(long milliSeconds) throws RemoteException;
}

:9~ ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Je kunt het programma ook laten kijken of hij ergens een bestandje ziet (iedere minuut ofzo). Als je het programma dan wilt afsluiten, maak je een bestand aan zoals "c:\shutdown.txt". Je programma zal dit bestand zien en zichzelf afsluiten. (bestandje kan overigens gewoon leeg zijn).
Pagina: 1