2012-04-20 12 views
24

Problema: Ho un'app standalone Java (d'ora in poi nota come "l'agente") che viene eseguita come servizio su server aziendali interni. Agisce come agente remoto per alcuni server centrali. Man mano che l'agente viene schierato in più punti, la loro gestione diventa sempre più complicata. Nello specifico: spingere gli aggiornamenti è doloroso perché è un processo abbastanza manuale, e ottenere l'accesso ai registri e altre informazioni sugli ambienti in cui gli agenti sono in esecuzione è problematico, rendendo difficile il debug. I server in discussione sono senza testa e non presidiati, il che significa che questo deve essere un processo completamente automatizzato senza alcun intervento manuale, quindi Java Web Start non è una soluzione valida.Come si effettua l'aggiornamento automatico di un'app Java?

Soluzione proposta: Effettuare periodicamente il telefono dell'agente (sui server centrali) per fornire lo stato dell'agente e verificare la presenza di aggiornamenti.

Sono aperto ad altre soluzioni suggerite al problema, ma ho già un prototipo funzionante per l'idea di "stato e autoaggiornamenti", su cui si concentra questa domanda.

Quello che mi è venuto in mente è in realtà un progetto separato che funge da wrapper per l'agente. Il wrapper chiama periodicamente il server centrale via HTTP per verificare una versione aggiornata dell'agente. Dopo aver trovato un aggiornamento, scarica la nuova versione, arresta l'agente in esecuzione e avvia il nuovo. Se questo sembra una soluzione pari o rotonda, qui ci sono alcune altre considerazioni/vincoli degni di nota:

  1. Quando l'involucro ottiene una nuova versione dell'agente, ci possono essere nuove dipendenze JAR, che significa cambiamenti di percorso di classe, nel senso che probabilmente voglio generare un processo Java separato invece di giocherellare con ClassLoaders e correre il rischio di una perdita di memoria di generazione permanente, che richiederebbe un intervento manuale - esattamente quello che sto cercando di scappare. Questo è il motivo per cui ho finito con un processo separato, "wrapper" per gestire gli aggiornamenti degli agenti nel mio prototipo.
  2. Alcuni server in cui gli agenti sono distribuiti sono limitati in termini di risorse, quindi qualsiasi soluzione deve essere in esaurimento per l'utilizzo della CPU e della memoria. Questo mi fa desiderare una soluzione che non implichi la rotazione di una nuova JVM ed è un colpo contro l'avere un processo di wrapper separato.
  3. L'agente è già distribuito su entrambi i server Windows e RHEL, quindi la soluzione deve essere multipiattaforma, anche se non avrei problemi a duplicare una quantità ragionevole del processo negli script batch e bash per far funzionare le cose.

Domanda: Come detto, voglio sapere come fare un auto-aggiornamento di Java app. Più specificamente, ci sono quadri/librerie là fuori che mi aiuterebbero con questo? Qualcuno con esperienza in quest'area può darmi qualche suggerimento?

+2

http://stackoverflow.com/questions/305461/automatic-updates-of-java-desktop-application –

+0

Vedere esempi di Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds # Distributedbuilds-LaunchslaveagentviaJavaWebStart –

+0

La tua soluzione non ti permetterebbe di aggiornare il wrapper stesso, giusto? – Miquel

risposta

0

Sembra che Webstart sia l'unico modo per farlo al momento.

+0

Vedere il mio commento all'altra risposta "Web Start". –

+0

down elettore cura di commentare? –

+0

Non ero io, ma mi aspetto che sia perché Webstart non è una soluzione alla domanda. –

2

Dai un'occhiata a Java Web Start.

È la tecnologia che fa parte di Java dal ... 1.5? forse 1,4? e consente la distribuzione e l'installazione di applicazioni standalone basate su Java tramite un browser Web. Ti consente inoltre di eseguire sempre l'ultima app.

http://www.oracle.com/technetwork/java/javase/overview-137531.html

http://en.wikipedia.org/wiki/JNLP#Java_Network_Launching_Protocol_.28JNLP.29

vedere anche questa domanda: What's the best way to add a self-update feature to a Java Swing application?

+1

Mi dispiace. Intendevo chiarire che si tratta di server senza testa e l'app viene eseguita come un demone di sfondo. Queste non sono workstation. Non hanno un ambiente desktop, tanto meno un browser per l'abilitazione all'avvio di Web.Ho visitato Web Start ma sono giunto alla conclusione che era orientato a fornire un'applicazione ad un utente. Questo deve essere completamente automatizzato e non presidiato. Aggiornerò la mia domanda per chiarire –

+0

Webstart può essere richiamato dalla riga di comando (non richiede un browser) utilizzando il comando javaws: http://docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/javaws.html –

+1

I ' Non sono sicuro, ma penso che non ci sia modo di prevenire il pop-up di sicurezza quando si usano javaws, anche dalla riga di comando. Per le persone che desiderano implementare applicazioni Java senza pagare un certificato di sicurezza affidabile o aggiornare silenziosamente le applicazioni Java esistenti, Java Web Start sta diventando sfavorevole. – Andy

4

Se l'applicazione è basata OSGi, si potrebbe lasciare gestire OSGi aggiornamenti di bundle per voi. È simile all'approccio wrapper suggerito, in quanto il contenitore OSGi stesso è "il wrapper" e parte di esso non verrà aggiornato. Ecco una discussione su this

+0

Buon pensiero. Ho considerato OSGi, ma c'è un limite di risorse da considerare. I contenitori OSGi che ho provato hanno un'impronta di memoria significativa senza nemmeno disporre di alcun bundle. Sarei felice di essere corretto su questo punto, però. –

+1

Un'altra risorsa da considerare è il tuo tempo. OSGi è estremamente invasivo nell'architettura della tua app e le regole di caricamento delle classi che impone possono richiedere del tempo per apprendere. Va bene una volta che sei attivo e in esecuzione (e avere qualcuno che implementa l'aggiornamento è fantastico!), Ma non pensare che sarebbe un lavoro da svolgere in una giornata. –

4

Soluzione diversa: utilizzare (e pagare) install4j. Controlla le funzionalità di aggiornamento automatico here

+0

Questo è il miglior vantaggio che abbia mai visto, che ho raccolto da [un'altra domanda] (http://stackoverflow.com/questions/207557/whats-the-best-way-to-add-a-self-update -funzione-a-un-java-swing-applicazione), anche se non ho scavato abbastanza in profondità per vedere se soddisfa davvero le mie esigenze. –

2

Nessuna necessità di wrapper (salva memoria) o java web start (aggiunge ulteriori restrizioni all'applicazione), semplicemente lascia che un thread nell'applicazione controlli periodicamente gli aggiornamenti (ad es. Dal cloud) e scaricare gli aggiornamenti, se disponibile, quindi codificare queste due chiamate a voi l'applicazione:

  1. lancio uno script di shell (.sh o .cmd) per aggiornare i manufatti e lancia l'applicazione, dopo pochi secondi di pausa nello script (per evitare di avere due istanze della tua applicazione allo stesso tempo).
  2. sospendere l'applicazione (prima istanza)

Lo script può sovrascrivere i manufatti necessari e ri-lanciare la vostra applicazione.

buon divertimento!

Problemi correlati