PDA

View Full Version : [Java] comunicazione tra processi


Swalke
02-12-2007, 20:28
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

Swalke
02-12-2007, 23:33
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)

lovaz
03-12-2007, 10:35
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

Angus
03-12-2007, 10:43
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 ;)

Angus
03-12-2007, 16:45
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:

Angus
03-12-2007, 18:39
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: