Frage

Wir haben eine Java-Server-Anwendung, die auf einer Anzahl von Computern ausgeführt, die alle mit dem Internet verbunden, einige hinter Firewalls. Wir müssen aus der Ferne die JAR-Dateien aktualisieren und Startskripts von einem zentralen Standort, ohne spürbare Unterbrechung der App selbst.

Der Prozess hat unbeaufsichtigt und narrensicher sein (das heißt wir die App nicht aufgrund vorzeitigen Internet-Ausfälle zu brechen leisten können).

In der Vergangenheit haben wir eine Vielzahl von externen Scripts und Dienstprogramme verwendet, um ähnliche Aufgaben zu bewältigen, sondern weil sie ihre eigenen Abhängigkeiten haben, ist das Ergebnis schwieriger zu pflegen und weniger tragbar. etwas Neues Bevor ich mag einige Eingaben aus der Community erhalten.

Hat jemand eine gute Lösung für dieses bereits gefunden? Haben Sie irgendwelche Ideen oder Anregungen?

Nur um zu klären: Diese App ist ein Server, aber nicht für Web-Anwendungen (keine Webapp Container oder SIND-Dateien hier). Es ist nur ein autonomes Java-Programm.

War es hilfreich?

Lösung

Sie haben nicht die Art von Server-Anwendungen angeben - ich gehe davon aus, dass Sie nicht Web-Anwendungen ausgeführt wird (als Krieg bereits Bereitstellung tut, was Sie sprechen, und Sie müssen nur sehr selten einen Web-App . ziehen Sie Typ-Updates Wenn Sie über einen Web-App sprechen, kann die folgende Diskussion noch anwenden - Sie werden nur die Update-Prüfung und Tischtennis für die WAR-Datei anstelle von einzelnen Dateien) implementieren

.

Sie können einen Blick auf jnlp nehmen wollen - WebStart auf dieser basiert (dies ist eine Client-Anwendung Deployment-Technologie), aber ich bin mir ziemlich sicher, dass es auf die Durchführung Updates für einen Servertyp App zugeschnitten werden. Unabhängig davon, tut jnlp einen ziemlich guten Job Deskriptoren bereitzustellen, die für das Herunterladen benötigte Versionen der erforderlichen JAR-Dateien verwendet werden kann ...

Einige allgemeinen Gedanken dazu (wir mehrere Anwendungen in dem gleichen Eimer haben und erwägen, einen Auto-Update-Mechanismus):

  1. Betrachten wir eine bootstrap.jar Datei, die einen jnlp Datei zum Lesen und Herunterladen erforderlich / aktualisiert Gläser vor dem Start der Anwendung in der Lage ist.

  2. JAR-Dateien kann auch aktualisiert werden, während eine Anwendung ausgeführt wird (zumindest unter Windows, und das ist das O höchstwahrscheinlichen Sperren halten Dateien auf ausgeführt wird). Sie können Probleme auftreten, wenn Sie benutzerdefinierte Classloader verwenden, oder Sie haben eine Reihe von JAR-Dateien, die geladen werden können oder jederzeit entladen, aber wenn man Mechanismen schaffen, dies zu verhindern, dann JAR-Dateien dann neu starten Sie die App überschreiben sollte ausreichend für die Aktualisierung.

  3. Auch wenn es möglich ist, JAR-Dateien zu überschreiben, können Sie einen Ping-Pong-Ansatz für Ihre lib Pfad betrachten (wenn Sie bereits haben Sie nicht Ihre App Launcher zu Auto-lesen alle JAR-Dateien in der konfigurierten lib Ordner und automatisch Pfad sie zur Klasse hinzufügen, dann etwas das sind Sie wirklich tun wollen). Hier ist, wie Pingpong funktioniert:

App startet und schaut lib-ping \ version.properties und lib-Pong \ version.properties und bestimmt, welche neuer ist. Lassen Sie uns sagen, dass lib-ping eine spätere Version hat. Der Launcher sucht nach lib-ping * .jar und fügt diese Dateien zum CP während des Starts. Wenn Sie ein Update zu tun, laden Sie JAR-Dateien in lib-pong (oder kopieren JAR-Dateien aus lib-ping, wenn Sie Bandbreite und die JAR-Datei speichern möchten, ändern nicht wirklich - das ist die Mühe wert selten ist, aber!). Wenn Sie alle JAR-Dateien in lib Tennis kopiert haben, das allerletzte, was Sie tun, ist die version.properties-Datei erstellen (auf diese Weise ein unterbrochenes Update, das in einem Teil lib Ordnern führt erkannt und gelöscht werden). Schließlich Sie erneut starten Sie die App und Bootstrap aufgreift, dass lib Tennis ist die gewünschte Classpath.

  1. Pingpong, wie oben beschrieben ermöglicht ein Roll-Back. Wenn Sie es richtig entwerfen, können Sie ein Stück Ihrer App, die Sie das Heck testen aus und ändern Sie dann nie überprüft, ob es sollte eine bestimmte Version Roll-Back. Auf diese Weise, wenn Sie vermasseln tun und bereitstellen etwas, das die App bricht, können Sie die Version ungültig machen. Dieser Teil der Anwendung hat gerade die version.properties Datei aus dem schlechten lib * Ordner zu löschen, dann wieder in Gang bringen. Es ist wichtig, diesen Teil Schmutz einfach zu halten, weil es Ihre ausfallsicher.

  2. Sie können mehr als 2 Ordner haben (statt Ping / Pong, hat nur lib-yyyymmdd und spülen alle, aber die neuesten 5, zum Beispiel). Dies ermöglicht eine erweiterte (aber komplizierter!) Rollback von JAR-Dateien.

Andere Tipps

Sie sollten auf jeden Fall einen Blick auf OSGi nehmen, war es nur für diese Fälle (speziell für Embedded-Produkte) erstellt und wird von einer großen Anzahl von Unternehmen eingesetzt. Sie können jar „Bündel“ aktualisieren, hinzufügen und entfernen Sie sie, während die App läuft. Ich habe es selbst nicht verwendet, so dass ich weiß nicht, über die Qualität des Open-Source-Frameworks / Servers, aber hier ist eine Reihe von nützlichen Links zum Einstieg:

http://www.osgi.org/Main/HomePage
http://www.aqute.biz/Code/Bnd
http://blog.springsource.com/2008/02/18 / Erstellung-OSGi-Bundles /
http://blog.springsource.com/
http://www.knopflerfish.org/
http://felix.apache.org/site/index.html

würde ich Capistrano für Multi-Server-Einsatz empfehlen. Während es für die Bereitstellung von Rails-Anwendungen integriert ist, habe ich es erfolgreich Anwendungen zu implementieren Java verwendet gesehen.

Link: Capistrano 2.0 nicht nur für Rails

Gläser können nicht geändert werden, während die JVM auf ihn laufen und zu Fehlern führen. Ich habe ähnliche Aufgaben ausprobiert und das Beste, was ich kam mit einer Kopie der aktualisierten Jar machen und den Übergangs der Startskript in diesem Jar zu suchen. Sobald Sie die aktualisierte Jar haben, starten Sie es und auf dem alten Jar warten, nachdem geben sie das Signal zu beenden, dies zu tun. Leider bedeutet dies einen Verlust von GUI etc. für eine Sekunde, aber die meisten der Strukturen in Java Serialisierung ist einfach und die aktuelle GUI auf die aktualisierte Anwendung übertragen werden könnte, bevor sie tatsächlich zu schließen (einige Dinge können nicht serialisierbar sein, obwohl!).

Es ist sehr schwer, das Update Atom zu machen, vor allem, wenn Sie eine Datenbankaktualisierung zu tun haben.

Aber, wenn Sie es nicht tun, was Sie tun können, ist zunächst Ihre Anwendung sicherstellen, dass von einem relativen Pfad laufen kann. Das heißt, Sie Ihre Anwendung in einem Verzeichnis setzen, und alle wichtigen Dateien werden in dieser Position relativ zu finden, so dass, dass Ihre tatsächliche Installationsort nicht wirklich wichtig ist.

Als nächstes duplizieren Sie Ihre Installation. Nun haben Sie die Version „running“ und Sie haben die „neue“ Version.

Aktualisieren Sie die "neue" Version mit, was tech Sie (FTP, rsync, Papierband, was auch immer Ihr Boot schwimmt).

Überprüfen Sie die Installation (Prüfsummen, schnelle Unit-Tests, was Sie brauchen - sogar auf einem Testanschluss starten, wenn Sie möchten).

Wenn Sie mit der neuen Installation zufrieden sind, auf der ursprünglichen laufende Instanz, benennen Sie das ursprüngliche Verzeichnis (mv Anwendung application_old), benennen Sie das neue Verzeichnis (mv application_new Anwendung), und starten Sie es wieder nach oben.

Ihre Ausfallzeit wird auf Server heruntergefahren reduziert und Zeit starten (seit Umbenennungs „frei“ ist).

Wenn durch Zufall Sie einen kritischen Fehler erkennen, Sie haben Ihre ursprüngliche Version immer noch da. Stoppen Sie den neuen Server, benennen Sie es zurück, starten Sie den alten. Sehr schnell zurückfallen.

Die andere nette Sache ist, dass Ihre Service-Infrastruktur statisch ist (wie Ihr rc-Skripte, Cron-Jobs, etc.), da sie auf das „Anwendung“ Verzeichnis verweisen, und es ändert sich nicht.

Es kann auch mit Soft-Links statt Umbenennung Verzeichnisse durchgeführt werden. In beiden Fällen ist in Ordnung.

Aber die Technik ist einfach, und in der Nähe von kugelsicher, wenn Ihre Anwendung zusammenarbeitet.

Wenn Sie nun DB Änderungen haben, gut, das ist völlig anders fiese Frage. Im Idealfall, wenn Sie Ihre DB Änderungen „abwärtskompatibel“ machen, dann hoffentlich die alte Version der Anwendung auf das neue Schema ausgeführt werden kann, aber das ist nicht immer möglich.

Ich glaube, Sie können JAR-Dateien Hot-bereitstellen, wenn Sie ein OSGi-basierten Anwendungsserver wie Springsource dm Server . Ich habe es selbst nie benutzt, aber die allgemeine Qualität des Frühlings-Portfolio zu wissen, ich bin sicher, dass es einen Blick wert.

Wir verwenden Eclipse-die das Update-System von OSGi, und unsere Erfahrung ist sehr gut.

zu empfehlen!

Die neueste Version von Java Web Start ermöglicht, ohne tatsächlich eine Anwendung im lokalen Cache zum Einspritzen des Programms aufrufen und es kann als „offline“ markiert. Da der Cache ist, was das Programm aufzurufen, verwendet wird, wird es nur für den nächsten Lauf aktualisiert werden. Dazu werden Sie wahrscheinlich arbeiten müssen Gläser mit Versionsnummern in ihrem Namen (zum Beispiel unser-Bibliothek-2009-06-01.jar).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top