diff --git a/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/boot/runtime/MicroGlassFish.java b/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/boot/runtime/MicroGlassFish.java index 4a67e9a9fb1..f8ba3956df5 100644 --- a/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/boot/runtime/MicroGlassFish.java +++ b/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/boot/runtime/MicroGlassFish.java @@ -1,7 +1,7 @@ /* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * - * Copyright (c) 2016 Payara Foundation and/or its affiliates. All rights reserved. + * Copyright (c) 2016-2019 Payara Foundation and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development @@ -39,6 +39,7 @@ */ package fish.payara.micro.boot.runtime; +import com.sun.enterprise.glassfish.bootstrap.GlassFishImpl; import com.sun.enterprise.module.bootstrap.ModuleStartup; import java.util.Properties; import org.glassfish.embeddable.CommandRunner; @@ -74,19 +75,20 @@ public void start() throws GlassFishException { } @Override - public void stop() throws GlassFishException { + public synchronized void stop() throws GlassFishException { if (status == Status.STOPPED || status == Status.STOPPING || status == Status.DISPOSED) { throw new IllegalStateException("Already in " + status + " state."); } - + status = Status.STOPPING; + GlassFishImpl.sleepShutdownGracePeriod(); kernel.stop(); habitat.shutdown(); status = Status.STOPPED; } @Override - public void dispose() throws GlassFishException { + public synchronized void dispose() throws GlassFishException { if (status == Status.DISPOSED) { throw new IllegalStateException("Already disposed."); } else if (status != Status.STOPPED) { diff --git a/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/cmd/options/RUNTIME_OPTION.java b/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/cmd/options/RUNTIME_OPTION.java index 5fd5233b2b8..cfb1ff823e1 100644 --- a/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/cmd/options/RUNTIME_OPTION.java +++ b/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/cmd/options/RUNTIME_OPTION.java @@ -103,7 +103,8 @@ public enum RUNTIME_OPTION { sslcert(true), help(false), enablesni(false), - hzpublicaddress(true); + hzpublicaddress(true), + shutdowngrace(true, new IntegerValidator(1, Integer.MAX_VALUE)); private RUNTIME_OPTION(boolean hasValue) { this(hasValue, new Validator()); diff --git a/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/impl/PayaraMicroImpl.java b/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/impl/PayaraMicroImpl.java index 40475ce0b78..e5c61fbcc8f 100644 --- a/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/impl/PayaraMicroImpl.java +++ b/appserver/extras/payara-micro/payara-micro-core/src/main/java/fish/payara/micro/impl/PayaraMicroImpl.java @@ -77,6 +77,7 @@ import org.glassfish.embeddable.GlassFishRuntime; import com.sun.appserv.server.util.Version; import com.sun.enterprise.glassfish.bootstrap.Constants; +import com.sun.enterprise.glassfish.bootstrap.GlassFishImpl; import com.sun.enterprise.server.logging.ODLLogFormatter; import fish.payara.micro.PayaraMicroRuntime; import fish.payara.micro.boot.PayaraMicroBoot; @@ -1382,6 +1383,9 @@ else if (requestTracing[0].matches("\\D+")) { case hzpublicaddress: publicAddress = value; break; + case shutdowngrace: + System.setProperty(GlassFishImpl.PAYARA_SHUTDOWNGRACE_PROPERTY, value); + break; default: break; } diff --git a/nucleus/core/bootstrap/src/main/java/com/sun/enterprise/glassfish/bootstrap/GlassFishImpl.java b/nucleus/core/bootstrap/src/main/java/com/sun/enterprise/glassfish/bootstrap/GlassFishImpl.java index ef53cd6d630..6c7f59536a2 100644 --- a/nucleus/core/bootstrap/src/main/java/com/sun/enterprise/glassfish/bootstrap/GlassFishImpl.java +++ b/nucleus/core/bootstrap/src/main/java/com/sun/enterprise/glassfish/bootstrap/GlassFishImpl.java @@ -37,7 +37,7 @@ * only if the new code is made subject to such option by the copyright * holder. * - * Portions Copyright [2017] Payara Foundation and/or affiliates + * Portions Copyright [2017-2019] Payara Foundation and/or affiliates */ package com.sun.enterprise.glassfish.bootstrap; @@ -57,6 +57,8 @@ public class GlassFishImpl implements GlassFish { + public static final String PAYARA_SHUTDOWNGRACE_PROPERTY = "fish.payara.shutdowngrace"; + private ModuleStartup gfKernel; private ServiceLocator habitat; volatile Status status = Status.INIT; @@ -87,10 +89,24 @@ public synchronized void stop() throws GlassFishException { throw new IllegalStateException("Already in " + status + " state."); } status = Status.STOPPING; + sleepShutdownGracePeriod(); gfKernel.stop(); status = Status.STOPPED; } + public static void sleepShutdownGracePeriod() { + String shutdowngrace = System.getProperty(PAYARA_SHUTDOWNGRACE_PROPERTY); + if (shutdowngrace != null) { + try { + Thread.sleep(Integer.parseInt(shutdowngrace)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (NumberFormatException e) { + // no sleep, continue shutdown + } + } + } + public synchronized void dispose() throws GlassFishException { if (status == Status.DISPOSED) { throw new IllegalStateException("Already disposed.");