View Full Version : [Java] comunicazione tra processi
Ciao a tutti.
Sto facendo un programmino in java e vorrei chiedervi un parere.
Devo fare in modo che quando il programma viene lanciato, controlla se era già in esecuzione e in tal caso non viene rieseguito (System.exit(0)).
Questa cosa posso ottenerla solo con la comunicazione tra i processi vero?
In ogni caso sapete darmi qualche indicazione o qualche link che può essermi d'aiuto?
Grazie mille.
morskott
02-12-2007, 21:23
quando lanci l'applicazione cerchi un file fake in una posizione nota, se non esiste lo crei, senno esci e alla terminazione del programma lo cancelli
Grazie per l'aiuto.
Al file ci avevo già pensato ma comporta delle inconvenienze.
Ad esempio il programma potrebbe essere terminato da task manager e in tal caso il file non verrebbe cancellato.
In oltre il file può essere cancellato o modificato dall'utente.
Altri consigli? :)
franksisca
02-12-2007, 23:56
conosci i pattern???
--->guarda qui<--- (http://en.wikipedia.org/wiki/Singleton_pattern)
Il singleton non funziona (diversa jvm).
Per il file usa un lock:
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileLock.html
conosci i pattern???
--->guarda qui<--- (http://en.wikipedia.org/wiki/Singleton_pattern)
Non dovrebbe funzionare in questo caso: stiamo parlando di due istanze di VM, due processi separati. Si potrebbe provare ad adattare l'idea del file all'apertura di un ServerSocket su una porta predefinita.
franksisca
03-12-2007, 10:55
Il singleton non funziona (diversa jvm).
Per il file usa un lock:
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileLock.html
Non dovrebbe funzionare in questo caso: stiamo parlando di due istanze di VM, due processi separati. Si potrebbe provare ad adattare l'idea del file all'apertura di un ServerSocket su una porta predefinita.
ops....non avevo capito lol :D
morskott
03-12-2007, 16:28
Grazie per l'aiuto.
Al file ci avevo già pensato ma comporta delle inconvenienze.
Ad esempio il programma potrebbe essere terminato da task manager e in tal caso il file non verrebbe cancellato.
In oltre il file può essere cancellato o modificato dall'utente.
Altri consigli? :)
Se subito dopo la creazione del file invochi sull'oggetto file una "deleteOnExit()" il file verrà automaticamente deletato alla chiusura della jvm, quindi anche se closi l'app da task manager, e poi per non farlo modificare dall'utente puoi settargli il flag "read only" con una "setReadOnly()", così non potrà venir modificato
franksisca
03-12-2007, 16:29
Se subito dopo la creazione del file invochi sull'oggetto file una "deleteOnExit()" il file verrà automaticamente deletato alla chiusura della jvm, quindi anche se closi l'app da task manager, e poi per non farlo modificare dall'utente puoi settargli il flag "read only" con una "setReadOnly()", così non potrà venir modificato
credo che sia una ottima soluzione ;)
credo che sia una ottima soluzione ;)
Il release del lock o la cancellazione automatica del file non può essere garantita in ogni caso, infatti nelle API si fa riferimento ad una "normal termination of the virtual machine". Credo però che il peggio che possa capitare sia che il file non venga automaticamente rimosso in casi particolari. Il lock dovrebbe comunque sparire da solo, anche se su NTFS questo richiede l'attesa di un timeout.
^TiGeRShArK^
03-12-2007, 18:33
Ma aprire un serversocket su una porta non standard e catchare l'eccezione e far terminare il programma in caso la porta sia già aperta? :stordita:
Ma aprire un serversocket su una porta non standard e catchare l'eccezione e far terminare il programma in caso la porta sia già aperta? :stordita:
Proposta già fatta, ma ignorata:
Si potrebbe provare ad adattare l'idea del file all'apertura di un ServerSocket su una porta predefinita.
Dark Phoenix
03-12-2007, 19:19
La butto lì...
il file lo crei e nel caso in cui una nuova istanza venga lanciata scrive sul file chiedendo di "poter partire"; l'altra istanza essendo in "attesa di aggiornamenti sul file" gli dà il NO.
Certo a questo punto forse è meglio una socket....
comunque un idea in più non fa male :p
^TiGeRShArK^
04-12-2007, 01:11
Proposta già fatta, ma ignorata:
bhè..
tanto per mettere d'accordo tutti si potrebbe usare un serversocket che prova ad aprire una porta e se non riesce la incrementa di uno..
fino a quando non la apre e allora scrive su un file di configurazione il valore della porta :p
...dubito che qualcuno sia tanto veloce da aprire due volte l'applicazione prima che il file sia stato aggiornato :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.