From 0b303fa2d4bd157e2c8d0ca8c38d3d8a14ed659f Mon Sep 17 00:00:00 2001 From: nmihajlovski Date: Sun, 29 Jan 2017 16:15:46 +0100 Subject: [PATCH] Improved app deployment tools. --- .../java/org/rapidoid/deploy/AppDeployer.java | 59 ++++++++++++------- .../goodies/deployment/DeploymentHandler.java | 19 +++++- .../deployment/JarDeploymentHandler.java | 3 +- .../goodies/deployment/JarStagingHandler.java | 3 +- 4 files changed, 57 insertions(+), 27 deletions(-) diff --git a/rapidoid-commons/src/main/java/org/rapidoid/deploy/AppDeployer.java b/rapidoid-commons/src/main/java/org/rapidoid/deploy/AppDeployer.java index 8408529e00..8a13640072 100644 --- a/rapidoid-commons/src/main/java/org/rapidoid/deploy/AppDeployer.java +++ b/rapidoid-commons/src/main/java/org/rapidoid/deploy/AppDeployer.java @@ -41,29 +41,34 @@ @Since("5.3.0") public class AppDeployer extends RapidoidThing { - private static final Processes DEPLOYED_PROCESSES = new Processes("deployed"); + private static final Processes DEPLOYED = new Processes("deployed"); - private static void runIfExists(String appJar) { + public static String defaultApp() { + return ClasspathUtil.appJar(); + } + + private static void runIfExists(String appId, String appJar) { if (new File(appJar).exists()) { - Log.info("Deploying pre-existing application JAR", "filename", appJar); + Log.info("Deploying pre-existing application JAR", "id", appId, "filename", appJar); - runJar(appJar); + runJar(appId, appJar); } } - private static void runJar(String appJar) { - Proc.group(DEPLOYED_PROCESSES) + private static void runJar(String appId, String appJar) { + Proc.group(DEPLOYED) + .id(appId) .printingOutput(true) .linePrefix("[APP] ") .run("java", "-jar", appJar); } - public static void deploy(String appJar) { - Log.info("Deploying JAR...", "filename", appJar); - U.must(U.notEmpty(appJar), "Empty application jar name was provided!"); + public static void deploy(String stagedAppJar, String appJar) { + U.must(U.notEmpty(stagedAppJar), "Empty application jar name was provided!"); - String stagedAppJar = appJar + ".staged"; - U.must(new File(stagedAppJar).exists(), "Cannot deploy, the application needs to be staged first!"); + Log.info("Deploying staged JAR...", "filename", stagedAppJar); + + U.must(new File(stagedAppJar).exists(), "Cannot deploy, the application needs to be staged first, cannot find: %s", stagedAppJar); try { Files.move(Paths.get(stagedAppJar), Paths.get(appJar), StandardCopyOption.REPLACE_EXISTING); @@ -71,16 +76,24 @@ public static void deploy(String appJar) { throw U.rte("Deployment error!", e); } - for (ProcessHandle handle : DEPLOYED_PROCESSES.items()) { - Log.info("Terminating the previously deployed application", "process", handle.params().command()); - handle.destroy(); - } - - runJar(appJar); + startOrRestartApp("app", appJar); Log.info("Deployed JAR", "filename", appJar); } + public static void startOrRestartApp(String appId, String appJar) { + ProcessHandle proc = DEPLOYED.find(appId); + + if (proc != null) { + Log.info("Restarting the previously deployed application", "id", proc.id(), "process", proc.params().command()); + proc.restart(); + + } else { + Log.info("Starting the deployed application", "id", proc.id(), "process", proc.params().command()); + runJar(appId, appJar); + } + } + public static void stageJar(String appJar, byte[] content) { String stagedAppJar = appJar + ".staged"; @@ -92,14 +105,20 @@ public static void stageJar(String appJar, byte[] content) { } public static Processes processes() { - return DEPLOYED_PROCESSES; + return DEPLOYED; } public static void bootstrap() { - String appJar = ClasspathUtil.appJar(); + String appJar = defaultApp(); if (U.notEmpty(appJar)) { - runIfExists(appJar); + runIfExists("app", appJar); } } + public static void stopApp(String appId) { + ProcessHandle proc = DEPLOYED.get(appId); + + Log.info("Stopping application", "id", proc.id(), "process", proc.params().command()); + proc.destroy(); + } } diff --git a/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/DeploymentHandler.java b/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/DeploymentHandler.java index 15cade287c..afe428e338 100644 --- a/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/DeploymentHandler.java +++ b/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/DeploymentHandler.java @@ -2,6 +2,7 @@ import org.rapidoid.annotation.Authors; import org.rapidoid.annotation.Since; +import org.rapidoid.commons.Str; import org.rapidoid.deploy.AppDeployer; import org.rapidoid.gui.Btn; import org.rapidoid.gui.GUI; @@ -110,7 +111,7 @@ public Object execute(Req req) throws Exception { .onSuccess(new Runnable() { @Override public void run() { - AppDeployer.deploy(filename); + AppDeployer.deploy(filename, Str.trimr(filename, ".staged")); } }) : null; @@ -118,19 +119,22 @@ public void run() { Btn delete = exists ? btn("Delete").command("delete_" + cmd) .class_("btn btn-danger btn-xs") - .confirm("Do you want do delete the file '" + filename + "'?") + .confirm("Do you want to delete the file '" + filename + "'?") : null; if (delete != null) { delete.onSuccess(new Runnable() { @Override public void run() { + AppDeployer.stopApp("app"); IO.delete(filename); } }); } Btn details = null; + Btn restart = null; + if (!staged && exists) { List processes = AppDeployer.processes().items(); @@ -142,6 +146,15 @@ public void run() { details = btn("Details") .class_("btn btn-default btn-xs") .go(processUrl); + + restart = btn("Restart") + .class_("btn btn-warning btn-xs") + .onSuccess(new Runnable() { + @Override + public void run() { + AppDeployer.startOrRestartApp("app", AppDeployer.defaultApp()); + } + }); } } @@ -151,7 +164,7 @@ public void run() { "exists", exists, "size", size, "since", since, - "actions", multi(deploy, details, delete) + "actions", multi(deploy, details, restart, delete) ); } diff --git a/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarDeploymentHandler.java b/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarDeploymentHandler.java index 5957ce5d4c..c4be8fea05 100644 --- a/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarDeploymentHandler.java +++ b/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarDeploymentHandler.java @@ -7,7 +7,6 @@ import org.rapidoid.http.NiceResponse; import org.rapidoid.http.Req; import org.rapidoid.http.ReqHandler; -import org.rapidoid.scan.ClasspathUtil; /* * #%L @@ -37,7 +36,7 @@ public class JarDeploymentHandler extends RapidoidThing implements ReqHandler { public Object execute(Req req) { try { - AppDeployer.deploy(ClasspathUtil.appJar()); + AppDeployer.deploy(AppDeployer.defaultApp() + ".staged", AppDeployer.defaultApp()); } catch (Exception e) { return NiceResponse.err(req, e); } diff --git a/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarStagingHandler.java b/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarStagingHandler.java index e8188847b5..a6e939f5e7 100644 --- a/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarStagingHandler.java +++ b/rapidoid-web/src/main/java/org/rapidoid/goodies/deployment/JarStagingHandler.java @@ -8,7 +8,6 @@ import org.rapidoid.http.Req; import org.rapidoid.http.ReqHandler; import org.rapidoid.io.Upload; -import org.rapidoid.scan.ClasspathUtil; /* * #%L @@ -40,7 +39,7 @@ public Object execute(Req req) throws Exception { Upload jar = req.file("file"); try { - AppDeployer.stageJar(ClasspathUtil.appJar(), jar.content()); + AppDeployer.stageJar(AppDeployer.defaultApp(), jar.content()); } catch (Exception e) { return NiceResponse.err(req, e); }