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:
- 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.
- 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.
- 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?
http://stackoverflow.com/questions/305461/automatic-updates-of-java-desktop-application –
Vedere esempi di Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds # Distributedbuilds-LaunchslaveagentviaJavaWebStart –
La tua soluzione non ti permetterebbe di aggiornare il wrapper stesso, giusto? – Miquel