You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2016/11/02 18:14:02 UTC
[2/3] activemq-artemis git commit: ARTEMIS-835 Quick restart of
broker will leave tmp dir dirty - Added a timeout wait on each web context's
tmp dir in WebServerComponent.stop() method.
ARTEMIS-835 Quick restart of broker will leave tmp dir dirty
- Added a timeout wait on each web context's tmp dir in
WebServerComponent.stop() method.
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/8c1ec12b
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/8c1ec12b
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/8c1ec12b
Branch: refs/heads/master
Commit: 8c1ec12b33170689156317d6c452da0caaa13f10
Parents: cdb52b8
Author: Howard Gao <ho...@gmail.com>
Authored: Wed Nov 2 21:27:20 2016 +0800
Committer: Clebert Suconic <cl...@apache.org>
Committed: Wed Nov 2 13:43:51 2016 -0400
----------------------------------------------------------------------
.../activemq/artemis/utils/TimeUtils.java | 92 ++++++++++++++++++++
.../activemq/artemis/utils/TimeUnitsTest.java | 57 ++++++++++++
.../activemq/artemis/utils/TimeUtils.java | 75 ----------------
.../activemq/artemis/ActiveMQWebLogger.java | 5 ++
.../artemis/component/WebServerComponent.java | 31 ++++++-
5 files changed, 182 insertions(+), 78 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8c1ec12b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java
new file mode 100644
index 0000000..f2819ac
--- /dev/null
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.utils;
+
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+/**
+ * Time utils.
+ */
+public final class TimeUtils {
+
+ private TimeUtils() {
+ }
+
+ /**
+ * Prints the duration in a human readable format as X days Y hours Z minutes etc.
+ *
+ * @param uptime the uptime in millis
+ * @return the time used for displaying on screen or in logs
+ */
+ public static String printDuration(double uptime) {
+ // Code taken from Karaf
+ // https://svn.apache.org/repos/asf/karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/InfoAction.java
+
+ NumberFormat fmtI = new DecimalFormat("###,###", new DecimalFormatSymbols(Locale.ENGLISH));
+ NumberFormat fmtD = new DecimalFormat("###,##0.000", new DecimalFormatSymbols(Locale.ENGLISH));
+
+ uptime /= 1000;
+ if (uptime < 60) {
+ return fmtD.format(uptime) + " seconds";
+ }
+ uptime /= 60;
+ if (uptime < 60) {
+ long minutes = (long) uptime;
+ String s = fmtI.format(minutes) + (minutes > 1 ? " minutes" : " minute");
+ return s;
+ }
+ uptime /= 60;
+ if (uptime < 24) {
+ long hours = (long) uptime;
+ long minutes = (long) ((uptime - hours) * 60);
+ String s = fmtI.format(hours) + (hours > 1 ? " hours" : " hour");
+ if (minutes != 0) {
+ s += " " + fmtI.format(minutes) + (minutes > 1 ? " minutes" : " minute");
+ }
+ return s;
+ }
+ uptime /= 24;
+ long days = (long) uptime;
+ long hours = (long) ((uptime - days) * 24);
+ String s = fmtI.format(days) + (days > 1 ? " days" : " day");
+ if (hours != 0) {
+ s += " " + fmtI.format(hours) + (hours > 1 ? " hours" : " hour");
+ }
+ return s;
+ }
+
+ public static boolean waitOnBoolean(boolean expected, long timeout, CheckMethod check) {
+ long timeLeft = timeout;
+ long interval = 10;
+ while (check.check() != expected && timeLeft > 0) {
+ try {
+ Thread.sleep(interval);
+ } catch (InterruptedException e) {
+ }
+ timeLeft -= interval;
+ }
+ return check.check() == expected;
+ }
+
+ public interface CheckMethod {
+ boolean check();
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8c1ec12b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TimeUnitsTest.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TimeUnitsTest.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TimeUnitsTest.java
new file mode 100644
index 0000000..ae09f9c
--- /dev/null
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TimeUnitsTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.utils;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class TimeUnitsTest {
+
+ @Rule
+ public TemporaryFolder folder = new TemporaryFolder();
+
+ @Test
+ public void testWaitOnBoolean() throws IOException {
+ File tmpFile = folder.newFile("myfile.txt");
+ assertTrue(tmpFile.exists());
+ long begin = System.currentTimeMillis();
+ boolean result = TimeUtils.waitOnBoolean(false, 2000, tmpFile::exists);
+ long end = System.currentTimeMillis();
+
+ assertFalse(result);
+ assertTrue(tmpFile.exists());
+ //ideally the sleep time should > 2000.
+ System.out.println("actually waiting time: " + (end - begin));
+ assertTrue((end - begin) >= 2000);
+ tmpFile.delete();
+ begin = System.currentTimeMillis();
+ result = TimeUtils.waitOnBoolean(false, 5000, tmpFile::exists);
+ end = System.currentTimeMillis();
+
+ assertTrue(result);
+ assertFalse(tmpFile.exists());
+
+ assertTrue((end - begin) < 5000);
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8c1ec12b/artemis-server/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java b/artemis-server/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java
deleted file mode 100644
index 5209a48..0000000
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/utils/TimeUtils.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.activemq.artemis.utils;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.util.Locale;
-
-/**
- * Time utils.
- */
-public final class TimeUtils {
-
- private TimeUtils() {
- }
-
- /**
- * Prints the duration in a human readable format as X days Y hours Z minutes etc.
- *
- * @param uptime the uptime in millis
- * @return the time used for displaying on screen or in logs
- */
- public static String printDuration(double uptime) {
- // Code taken from Karaf
- // https://svn.apache.org/repos/asf/karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/InfoAction.java
-
- NumberFormat fmtI = new DecimalFormat("###,###", new DecimalFormatSymbols(Locale.ENGLISH));
- NumberFormat fmtD = new DecimalFormat("###,##0.000", new DecimalFormatSymbols(Locale.ENGLISH));
-
- uptime /= 1000;
- if (uptime < 60) {
- return fmtD.format(uptime) + " seconds";
- }
- uptime /= 60;
- if (uptime < 60) {
- long minutes = (long) uptime;
- String s = fmtI.format(minutes) + (minutes > 1 ? " minutes" : " minute");
- return s;
- }
- uptime /= 60;
- if (uptime < 24) {
- long hours = (long) uptime;
- long minutes = (long) ((uptime - hours) * 60);
- String s = fmtI.format(hours) + (hours > 1 ? " hours" : " hour");
- if (minutes != 0) {
- s += " " + fmtI.format(minutes) + (minutes > 1 ? " minutes" : " minute");
- }
- return s;
- }
- uptime /= 24;
- long days = (long) uptime;
- long hours = (long) ((uptime - days) * 24);
- String s = fmtI.format(days) + (days > 1 ? " days" : " day");
- if (hours != 0) {
- s += " " + fmtI.format(hours) + (hours > 1 ? " hours" : " hour");
- }
- return s;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8c1ec12b/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
----------------------------------------------------------------------
diff --git a/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java b/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
index 4200955..e4fd854 100644
--- a/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
+++ b/artemis-web/src/main/java/org/apache/activemq/artemis/ActiveMQWebLogger.java
@@ -22,6 +22,8 @@ import org.jboss.logging.annotations.LogMessage;
import org.jboss.logging.annotations.Message;
import org.jboss.logging.annotations.MessageLogger;
+import java.io.File;
+
/**
* Logger Code 24
*
@@ -52,4 +54,7 @@ public interface ActiveMQWebLogger extends BasicLogger {
@Message(id = 241002, value = "Artemis Jolokia REST API available at {0}", format = Message.Format.MESSAGE_FORMAT)
void jolokiaAvailable(String bind);
+ @LogMessage(level = Logger.Level.WARN)
+ @Message(id = 244003, value = "Temporary file not deleted on shutdown: {0}", format = Message.Format.MESSAGE_FORMAT)
+ void tmpFileNotDeleted(File tmpdir);
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8c1ec12b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
----------------------------------------------------------------------
diff --git a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
index 699dce3..a34d179 100644
--- a/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
+++ b/artemis-web/src/main/java/org/apache/activemq/artemis/component/WebServerComponent.java
@@ -16,16 +16,20 @@
*/
package org.apache.activemq.artemis.component;
+import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
import org.apache.activemq.artemis.ActiveMQWebLogger;
import org.apache.activemq.artemis.components.ExternalComponent;
import org.apache.activemq.artemis.dto.AppDTO;
import org.apache.activemq.artemis.dto.ComponentDTO;
import org.apache.activemq.artemis.dto.WebServerDTO;
+import org.apache.activemq.artemis.utils.TimeUtils;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
@@ -46,6 +50,7 @@ public class WebServerComponent implements ExternalComponent {
private WebServerDTO webServerConfig;
private URI uri;
private String jolokiaUrl;
+ private List<WebAppContext> webContexts;
@Override
public void configure(ComponentDTO config, String artemisInstance, String artemisHome) throws Exception {
@@ -87,9 +92,11 @@ public class WebServerComponent implements ExternalComponent {
Path warDir = Paths.get(artemisHome != null ? artemisHome : ".").resolve(webServerConfig.path).toAbsolutePath();
- if (webServerConfig.apps != null) {
+ if (webServerConfig.apps != null && webServerConfig.apps.size() > 0) {
+ webContexts = new ArrayList<>();
for (AppDTO app : webServerConfig.apps) {
- deployWar(app.url, app.war, warDir);
+ WebAppContext webContext = deployWar(app.url, app.war, warDir);
+ webContexts.add(webContext);
if (app.war.startsWith("jolokia")) {
jolokiaUrl = webServerConfig.bind + "/" + app.url;
}
@@ -121,6 +128,23 @@ public class WebServerComponent implements ExternalComponent {
@Override
public void stop() throws Exception {
server.stop();
+ if (webContexts != null) {
+ File tmpdir = null;
+ for (WebAppContext context : webContexts) {
+ tmpdir = context.getTempDirectory();
+
+ if (tmpdir != null && !context.isPersistTempDirectory()) {
+ //tmpdir will be removed by deleteOnExit()
+ //somehow when broker is stopped and restarted quickly
+ //this tmpdir won't get deleted sometimes
+ boolean fileDeleted = TimeUtils.waitOnBoolean(false, 10000, tmpdir::exists);
+ if (!fileDeleted) {
+ ActiveMQWebLogger.LOGGER.tmpFileNotDeleted(tmpdir);
+ }
+ }
+ }
+ webContexts.clear();
+ }
}
@Override
@@ -128,7 +152,7 @@ public class WebServerComponent implements ExternalComponent {
return server != null && server.isStarted();
}
- private void deployWar(String url, String warFile, Path warDirectory) throws IOException {
+ private WebAppContext deployWar(String url, String warFile, Path warDirectory) throws IOException {
WebAppContext webapp = new WebAppContext();
if (url.startsWith("/")) {
webapp.setContextPath(url);
@@ -138,5 +162,6 @@ public class WebServerComponent implements ExternalComponent {
webapp.setWar(warDirectory.resolve(warFile).toString());
handlers.addHandler(webapp);
+ return webapp;
}
}