Problem: Ich habe eine eigenständige Java-Anwendung (im Folgenden als "der Agent" bezeichnet), die als Dienst auf internen Unternehmensservern ausgeführt wird. Es fungiert als Remote-Agent für einige zentrale Server. Wenn der Agent an mehreren Orten bereitgestellt wird, wird die Verwaltung der Agenten komplizierter. Insbesondere: Das Push-up von Updates ist schmerzhaft, da es sich um einen ziemlich manuellen Prozess handelt und der Zugriff auf die Protokolle und andere Informationen über die Umgebungen, in denen die Agenten ausgeführt werden, problematisch ist, was das Debugging erschwert. Die diskutierten Server sind kopflos und unbeaufsichtigt, was bedeutet, dass dies ein vollautomatischer Prozess ohne manuellen Eingriff sein muss. Daher ist Java Web Start keine praktikable Lösung.Wie kann ich eine Java-App selbst aktualisieren?
Vorgeschlagene Lösung: Machen Sie das Agent-Telefon regelmäßig (zu den zentralen Servern), um den Agentenstatus anzuzeigen und nach Updates zu suchen.
Ich bin offen für andere vorgeschlagene Lösungen für das Problem, aber ich habe bereits einen funktionierenden Prototyp für die "Status und Self-Updates" Idee, auf die sich diese Frage konzentriert.
Was ich entwickelte, ist eigentlich ein separates Projekt, das als Wrapper für den Agenten fungiert. Der Wrapper ruft den zentralen Server regelmäßig über HTTP auf, um nach einer aktualisierten Version des Agenten zu suchen. Wenn ein Update gefunden wird, lädt es die neue Version herunter, beendet den laufenden Agenten und startet den neuen. Wenn das wie eine ungerade oder Kreisverkehr Lösung scheint, hier sind ein paar andere Überlegungen/Zwänge bemerkenswert:
- Wenn der Wrapper eine neue Version des Agenten erhält, kann es neue JAR-Abhängigkeiten, Klassenpfad Änderungen bedeutet, Das bedeutet, dass ich wahrscheinlich einen separaten Java-Prozess erstellen möchte, anstatt an ClassLoadern herumzufummeln und das Risiko eines permanenten Speicherverlusts zu generieren, der manuelle Eingriffe erfordern würde - genau das, was ich versuche wegzukommen. Aus diesem Grund habe ich einen separaten "Wrapper" -Prozess zur Verwaltung der Agentenaktualisierungen in meinem Prototyp abgeschlossen.
- Einige Server, auf denen die Agenten bereitgestellt werden, sind ressourcenbegrenzt. Daher muss bei jeder Lösung die CPU- und Speicherauslastung gering sein. Das bringt mich dazu, eine Lösung zu suchen, bei der keine neue JVM erstellt werden muss und die einen separaten Wrapper-Prozess verhindert.
- Der Agent ist bereits auf Windows- und RHEL-Servern implementiert, daher muss die Lösung plattformübergreifend sein, obwohl ich kein Problem haben würde, einen vernünftigen Teil des Prozesses in Batch- und Bash-Skripten zu duplizieren.
Frage: Wie bereits erwähnt, möchte ich wissen, wie eine sich selbst aktualisierende Java-Anwendung zu machen. Genauer gesagt, gibt es irgendwelche Frameworks/Bibliotheken, die mir dabei helfen könnten? Kann jemand mit Erfahrung in diesem Bereich mir einige Hinweise geben?
http://stackoverflow.com/questions/305461/automatic-updates-of-java-desktop-application –
Siehe Jenkins Beispiele: https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds # Distributedbuilds-LaunchslaveagentviaJavaWebStart –
Ihre Lösung würde Ihnen nicht erlauben, den Wrapper selbst zu aktualisieren, richtig? – Miquel