Manuale di JUnique 1.0
La libreria JUnique può eseguire operazioni di lock condivise tra più JVM. E' stata ideata per impedire che un utente possa avviare contemporaneamente più istanze della stessa applicazione Java. Inoltre JUnique offre dei canali di comunicazione attraverso i quali più software Java eseguiti in differenti JVM possono scambiarsi dei messaggi.
JUnique si basa su un concetto di lock esclusivo extra-JVM relativo all'utente. Immagina di voler impedire che la tua applicazione Java per ambiente desktop possa essere avviata più di una volta dallo stesso utente. Nel main() dell'applicazione puoi richiedere a JUnique un lock su un certo ID, ad esempio il_nome_della_mia_applicazione. Al primo lancio l'ID sarà sicuramente disponibile e quindi il lock sarà stabilito senza problemi. L'ID viene così bloccato. Il lock sull'ID scelto può essere rilasciato esplicitamente dallo stesso software che lo ha imposto, attraverso una chiamata al metodo JUnique.releaseLock(). In caso contrario il lock sarà rilasciato automaticamente all'arresto della JVM. Finché si resta nell'ambito della stessa utenza, nessun software Java eseguito da qualsiasi JVM può ottenere un lock su un ID che è stato precedentemente bloccato e non è stato ancora rilasciato. Se lo stesso utente avvia una seconda istanza dell'applicazione mentre la prima è ancora in esecuzione, questa non riuscirà a stabilire il lock sull'ID, e JUnique solleverà una AlreadyLockedException. Questo tipo di eccezione informa l'applicazione del fatto che una sua copia gemella è già in esecuzione. La seconda istanza, riscontrato ciò, può pertanto interrompere la sua sequenza di avvio, ma prima di terminare può anche inviare dei messaggi alla gemella attiva con il metodo JUnique.sendMessage().
Si faccia attenzione al fatto che i lock di JUnique sono correlati all'utente che esegue l'applicazione: due utenze differenti che accedono insieme allo stesso sistema possono ancora avviare due istanze separate di una stessa applicazione, una per ciascuna utenza.
Requisiti
Per eseguire correttamente la libreria JUnique è richiesto un Java Runtime Environment J2SE versione 1.4 o successiva.
Installazione
Aggiungi il file JAR di JUnique al classpath della tua applicazione, e potrai automaticamente usare le classi di JUnique.
Javadoc
Ecco la documentazione javadoc di JUnique.
Guida rapida
Un esempio di metodo main() che impedisce ad una applicazione di avere più istanze simultaneamente in esecuzione per lo stesso utente:
public static void main(String[] args) { String appId = "myapplicationid"; boolean alreadyRunning; try { JUnique.acquireLock(appId); alreadyRunning = false; } catch (AlreadyLockedException e) { alreadyRunning = true; } if (!alreadyRunning) { // Start sequence here } }
Un esempio con scambio di messaggi e passaggio di argomenti. Gli argomenti ricevuti dall'istanza che sceglie di non avviarsi vengono trasmessi all'istanza attiva prima del termine del metodo:
public static void main(String[] args) { String appId = "myapplicationid"; boolean alreadyRunning; try { JUnique.acquireLock(appId, new MessageHandler() { public String handle(String message) { // A brand new argument received! Handle it! return null; } }); alreadyRunning = false; } catch (AlreadyLockedException e) { alreadyRunning = true; } if (!alreadyRunning) { // Start sequence here } else { for (int i = 0; i < args.length; i++) { JUnique.sendMessage(appId, args[0])); } } }
Strategie per gli ID di lock
Per evitare potenziali conflitti, è consigliabile scegliere degli ID di lock qualificanti per ciascuna applicazione che fa uso di JUnique. Non è una buona idea scegliere degli ID troppo generici come "notepad", "chat" o "myapp". E' meglio usare un ID del tipo "mioNome.miaApplicazione", e meglio ancora è usare come ID il nome completo della principale classe dell'applicazione.