Toon posts:

[Java] Controleren of het programma al draait

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met het schrijven van een conversie programma wat WP teksten om moet zetten in XML. Dit programma moet constant gaan draaien en automatisch WP teksten converteren. Op zich geen probleem, maar ik maak gebruik van een extern programma om de WP teksten leesbaar te maken. Dit externe programma is helaas niet zo stabiel, en kan ervoor zorgen dat m'n java VM crasht.

Oplossing: ik zorg ervoor dat het programma iedere 10 minuten opnieuw gestart wordt (met cron), en kijkt of er al een andere versie van dat programma draait. Is dat het geval, dat wordt het laatst gestarte programma meteen weer afgesloten.

Op dit moment controleer ik dat met behulp van een klein bestandje. Iedere minuut wordt de datum+tijd weg geschreven en als het programma gestart wordt, wordt in dat bestandje gekeken.

Kan dit ook anders? Kan ik vanuit Java meteen zien of er een andere VM geladen is, en welke programma's daar in draaien? (en zo ja: hoe? :))

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 24-05 09:13

Janoz

Moderator Devschuur®

!litemod

Is het niet veel makkelijker om je applicatie beter te beschermen tegen die crashende externe aplpicatie? Op wat voor manier crashed de JVM eigenlijk?

Om te kijken of iets ook draait is het wel handig als we ook het OS weten ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Het OS: Windows 2000 of windows 2003.

Ik zou er graag voor zorgen dat die externe applicatie niet vast loopt, maar ik kan die crash niet reproduceren. Daarom kan ik de ontwikkelaars van het programma wel inlichten, maar of ze er ook iets aan kunnen doen weet ik niet. En ALS ze er iets aan kunnen doen, kan ik er dan op vertrouwen dat die applicatie dan WEL werkt? Vandaar dat ik dit inbouw als een extra beveiliging.

De foutmelding:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x7961AD51
Function=UnhandledExceptionFilter+0x339
Library=C:\WINNT\system32\KERNEL32.DLL

Current Java thread:
    at java.lang.Win32Process.create(Native Method)
    at java.lang.Win32Process.<init>(Win32Process.java:63)
    at java.lang.Runtime.execInternal(Native Method)
    at java.lang.Runtime.exec(Runtime.java:566)
    at java.lang.Runtime.exec(Runtime.java:428)
    at fnb.util.process.Process.start(Process.java:33)
    at fnb.altools.wp2xml.Wp2txt.convert(Wp2txt.java:20)
    at fnb.altools.wp2xml.Wp2txt.convert(Wp2txt.java:30)
    at fnb.altools.wp2xml.Convert.convert(Convert.java:37)
    at fnb.altools.wp2xml.Prepare.<init>(Prepare.java:30)
    at fnb.altools.wp2xml.Prepare.main(Prepare.java:45)

Dynamic libraries:
0x00400000 - 0x00407000     D:\JBuilder9\jdk1.4\bin\javaw.exe
(enzovoorts)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Kun je geen andere converters vinden? (die niet vastlopen) en het liefste ook 100% java zijn.

Verder kan je met rmi/sockets wel voor elkaar krijgen om te checken of een andere applicatie al draait.

Er zijn trouwens ook tools waarmee je een java applicatie als windows service kan laten draaien.

[ Voor 20% gewijzigd door Alarmnummer op 05-07-2004 13:28 ]


Verwijderd

Topicstarter
Er zullen vast wel andere converters zijn, maar om die op te zoeken kost me (mijn baas eigenlijk) te veel tijd.

Maar bedankt voor die tip van sockets. Dat lost meteen een aantal problemen op die ik nu in mijn methode heb :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Misschien kan je hier nog even naar kijken. Het is wel voor de ms formaten.. maar altijd handig om te weten dat het bestaat.

http://jakarta.apache.org/poi/

  • TukkerTweaker
  • Registratie: November 2001
  • Laatst online: 22-05 13:21
Verwijderd schreef op 05 juli 2004 @ 13:38:
Er zullen vast wel andere converters zijn, maar om die op te zoeken kost me (mijn baas eigenlijk) te veel tijd.
En vanalles te proberen wat misschien geen bevredigend resultaat geeft niet?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 24-05 09:13

Janoz

Moderator Devschuur®

!litemod

Kun je die exception niet afvangen en vervolgens afhandelen? Op die manier vliegt je applicatie zelf er niet uit.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Janoz schreef op 05 juli 2004 @ 13:45:
Kun je die exception niet afvangen en vervolgens afhandelen? Op die manier vliegt je applicatie zelf er niet uit.
Als je vm eruit knalt dan valt er binnen de vm niets meer af te handelen denk ik.

Verwijderd

Topicstarter
TukkerTweaker schreef op 05 juli 2004 @ 13:44:
[...]

En vanalles te proberen wat misschien geen bevredigend resultaat geeft niet?
Dit probleem ontdekte ik pas toen de conversie zelf klaar was en ik een heleboel bestanden na elkaar ging converteren. Dus het is makkelijker/sneller om het probleem op deze manier op te lossen dan om de hele conversie weer opnieuw te schrijven.

Alarmnummer:
Bedankt! Die link is zeker de moeite waard. Ok, misschien niet direct voor dit probleem, maar wel voor andere projecten waar ik ook nog aan werk :)

Verwijderd

Als ik een hele ranzige (echter simpele) oplossing mag aandragen:

Je programma starten met een bat of shell file.
In je main (oid) check je op een bestandje (bijv running.tmp) bestaat,
Als het bestand niet bestaat maak je deze aan en vervolg je met het gewoon runnen van je programma. Bestaat het bestand wel dan weet je dat er al een VM draait en dat je kunt exitten.
Na het java (in het shell/bat script) commando verwijder je vervolgens het bestand.

Probleem is alleen dat ik niet weet of de VM blijft wachten op input of dat hij gewoon zelf sterft. Als hij blijft wachten is dit ook geen oplossing :?

hope it helps

Verwijderd

Je kunt het progje vanuit een 2e vm starten. Gewoon een simpel while(...) lusje met een runtime.exec en mbv. process.waitFor() wachten tot het crasht.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
of je maakt een batch file die nooit eindigt:
code:
1
2
3
:begin
<programma uitvoeren>
goto begin

Er wordt hier niet geloopt (tenzij je programma crashed) en ook niet gepolled. Handig joh, batch-files :)
Pagina: 1