Wie mache ich eine Java app selbst aktualisieren?

Problem: ich habe eine standalone-Java-app (im folgenden bezeichnet als "der agent"), der als Dienst läuft auf interne Unternehmens-Servern. Es wirkt wie ein remote-agent für einige zentrale Server. Als der agent erhält bereitgestellt, die in mehr Orte, die Verwaltung wird immer komplizierter. Speziell: durch updates ist schmerzhaft, weil es ein Recht manueller Prozess, und der Zugriff auf die Protokolle und weitere Infos über die Umgebungen, in denen die Agenten ausgeführt werden, ist problematisch, so dass das Debuggen schwierig. Die Server in der Diskussion sind headless und unbeaufsichtigt, was bedeutet, dass es sich um einen voll automatisierten Prozess ohne manuellen Eingriff, daher Java Web Start ist nicht eine praktikable Lösung.

Vorgeschlagene Lösung: Stellen Sie den agent-Telefon zu Hause (auf dem zentralen Server) regelmäßig zu bieten-agent-status und-updates prüfen.

Ich bin offen für andere vorgeschlagene Lösungen für das problem, aber ich habe bereits einen funktionierenden Prototypen für die "status-und self-updates" - Idee, die ist, was diese Frage fokussiert wird.

Was ich kam mit ist eigentlich ein separates Projekt, das als wrapper für den Agenten. Die wrapper in regelmäßigen Abständen ruft die zentralen server über HTTP zu überprüfen, ob eine aktualisierte version des Agenten. Auf der Suche nach einem update, lädt es die neue version, schaltet sich das agent ausgeführt wird, und beginnt das neue. Wenn das scheint wie eine seltsame oder Kreisverkehr-Lösung, hier sind ein paar weitere überlegungen/Einschränkungen erwähnenswert:

  1. Wenn der wrapper erhält eine neue version des agent, möglicherweise gibt es neue JAR-Abhängigkeiten, was bedeutet class-path ändert, was bedeutet, dass ich wahrscheinlich wollen, um zu laichen einen eigenen Java-Prozess statt hantieren mit Classloadern und Gefahr zu laufen, eine dauerhafte generation memory leak, das wäre ein manueller Eingriff erforderlich-genau das, was ich versuche, um Weg von. Dies ist der Grund, warum ich landete mit einem separaten, "wrapper" - Prozess zur Verwaltung des agent-updates in mein Prototyp.
  2. Einige Server, auf denen die Agenten bereitgestellt werden, sind die Ressourcen begrenzt, so dass jede Lösung muss niedrig sein, die auf CPU-und Speichernutzung. Das macht mich wollen eine Lösung, die nicht die Spinnen eine neue JVM und ist ein Schlag gegen eine separate wrapper-Prozess.
  3. Der agent ist bereits im Einsatz auf Windows-und RHEL-Servern, so muss die Lösung sein, cross-Plattform, obwohl ich würde nicht habe ein problem beim duplizieren einer angemessenen Betrag des Prozesses in batch-und bash-Skripte, um die Dinge ins Rollen.

Frage: Wie gesagt, ich möchte wissen, wie Sie eine self-Update-Java-app. Genauer gesagt, gibt es irgendwelche frameworks/Bibliotheken gibt, die würden mir helfen mit diesem? Kann jemand mit Erfahrungen in diesem Bereich geben Sie mir einige Hinweise?

  • stackoverflow.com/questions/305461/...
  • Siehe Jenkins Beispiele: wiki.jenkins-ci.org/display/JENKINS/...
  • Ihre Lösung würde nicht lassen Sie ein update der wrapper selbst, richtig?
  • Richtig. Eine ideale Lösung wäre eine, wo es nichts eingesetzt, dass kann nicht aktualisiert werden. Meine wrapper-Prototyp ist sicherlich nicht so, aber im Idealfall (wieder), die wrapper müssen nicht aktualisiert, weil es eine einfache Aufgabe und nur wenigen beweglichen teilen.
  • Guter link. Ich haben zu denken, dass man. Den Jenkins-Modell lässt sich mir den Wechsel von einer pull-zu einer push, wo die zentralen Server weitergeleitet werden könnten, um einen agent zu installieren oder ein update auf einem remote-server über SSH oder einige andere Protokoll.
  • Nach 2 Jahren, welche Lösung du genommen hast? Verfasst Eure eigenen wrapper oder bestehende frameworks/Bibliotheken wie ace.apache.org? Ich habe das gleiche problem zu verwalten > 3000-Agenten.
  • können Sie überprüfen, ob ich noch Antwort ?

InformationsquelleAutor Ryan Stewart | 2012-04-20
Schreibe einen Kommentar