Newsgroup: it.comp.java
Titolo: Limitare apertura applicazioni

Ho creato un'applicazione e vorrei fare in modo che venga istanziata una 
sola volta anche se continuo ad avviarla, e possibile, come si fa?
Con le classi interne ho risolto con una variabile statica, ma con la 
classe principale proprio non mi riesce :(
Mi date una mano??
XXXXXX


Ogni volta che lanci l'applicazione, parte una nuova VM.
Crea un file temporaneo appena l'applicazione parte e controlla se gia'
esiste.
Soluzione poco elegante, sopratutto se l'applicazione termina in maniera
"sporca" senza cancellare il file temporaneo di controllo.
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

Non avendo qualcosa di meglio da fare >Giambo< ci ha regalato queste 
perle di saggezza il giorno 01/03/2005 20.29 :

Ok, provero' cosi' :)
Grazie
XXXXXX

 "sporca" senza cancellare il file temporaneo di controllo.
Se appena crei il file lanci il metodo deleteOnExit(), il file verrà
cancellato dalla JVM all'uscita dell'applicazione, anche se essa termina
male.
Ovviamente a meno di Errori interni alla JVM.
-- 
Pietro	- 
http://www.pietroweb.tk
Linux Registered User #304991
Powered by MDK Linux Kernel 2.6.10



Prova ad utilizzare un file di lock oppure un socket


 Ovviamente a meno di Errori interni alla JVM.
Altra soluzione potrebbe essere quella di far girare all'interno
dell'applicazione un thread che ascolta su un socket. Quando
l'applicazione parte, manda una rischiesta al socket e se riceve una
risposta, vuol dire che c'e' gia' un'instanza che gira.


XXXXXX wrote:

Un file di lock è un'idea (File.deleteOnExit() ti può aiutare).

 risposta, vuol dire che c'e' gia' un'instanza che gira.
Ma è bruttissimo! :)
A quel punto, tanto vale usare il socket in ascolto direttamente come 
semaforo, almeno è atomico. La seconda applicazione non riesce a fare il 
binding perchè lo trova occupato e sei a posto.

Vincent Vega:

Si ho utilizzato questo, grazie!
XXXXXX

Vincent Vega wrote:

Magari il socket e' gia' occupato da un'altra applicazione.
Soluzione bellissima:
- Applicazione parte, prova ad ascoltare su socket n
- Se socket n e' occupato, prova a mandare un request
- Se la risposta e' come ci si aspettava => L'applicazione gira gia', end.
- Altrimenti => Socket occupato da un'applicazion estranea (emule,
trojan, ...): Prova ad ascoltare su socket n+1
- Ripeti finche' non ha testato una decina/dozzina/centinaio/migliaio di
socket.


 socket.
Certo. Dopo aver fatto tutti i test deduce che nessun'altra applicazione 
è in esecuzione.
Per poi scoprire che nel frattempo c'era un'altra istanza in avvio, che 
stava facendo la stessa cosa, siccome non si sono incontrati (sculo) ha 
fatto la stessa deduzione.
Puoi farla complicata come vuoi, ma se non è atomica non funziona.

 Puoi farla complicata come vuoi, ma se non è atomica non funziona.
Ovviamente la mia soluzione non pretende di essere quella perfetta, ma
mi pare piu' robusta della creazione di un file temporaneo. Almeno non
c'e' il rischio di avere un file temporaneo "floating" a causa del crash
dell'applicazione.
+++
java.nio.channels.FileLock
"
A file-lock object is initially valid. It remains valid until the lock
is released by invoking the release method, by closing the channel that
was used to acquire it, or by the termination of the Java virtual
machine, whichever comes first. The validity of a lock may be tested by
invoking its isValid method.
"
Eccola, la soluzione giusta.


Giambo:

Puoi farmi un esempio funzionante?
Grazie
XXXXXX

 Puoi farmi un esempio funzionante?
No, non l'ho mai usato. Pero' la documentazione mi pare fatta bene:
http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/FileLock.html
Googelando ho trovato questo:
http://www.rgagnon.com/javadetails/java-0288.html
Vedo che e' citata pure la mia idea basata sui sockets, nonostante la
disapprovazione di Vincent Vega :-)



L'ho provato al volo cosi' come e' e il secondo esempio sembra 
funzionare e fare al caso mio
Grazie
XXXXXX