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 2019/08/02 17:26:29 UTC

[activemq-artemis] 01/03: ARTEMIS-2438 Activation cleaning

This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git

commit 73e2d4709d5ed18c10de3cc1bad3005c2d08d29a
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Thu Aug 1 15:54:06 2019 -0400

    ARTEMIS-2438 Activation cleaning
---
 .../apache/activemq/artemis/cli/commands/Run.java  |  4 +-
 .../jms/server/impl/JMSServerManagerImpl.java      |  4 +-
 .../artemis/core/server/ActivateCallback.java      | 11 +++++
 .../core/server/impl/ActiveMQServerImpl.java       |  8 ++++
 .../CleaningActivateCallback.java}                 | 33 ++++++--------
 .../artemis/core/server/impl/InVMNodeManager.java  |  2 +-
 .../core/server/impl/jdbc/JdbcNodeManager.java     |  3 +-
 .../management/impl/ManagementServiceImpl.java     |  4 +-
 .../cluster/bridge/BridgeReconnectTest.java        |  1 -
 .../integration/discovery/DiscoveryBaseTest.java   |  3 +-
 .../integration/server/ActivationCallbackTest.java | 51 ++++++++++++++++++++++
 11 files changed, 94 insertions(+), 30 deletions(-)

diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Run.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Run.java
index 759815c..d7a26cb 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Run.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Run.java
@@ -29,7 +29,7 @@ import org.apache.activemq.artemis.cli.factory.BrokerFactory;
 import org.apache.activemq.artemis.cli.factory.jmx.ManagementFactory;
 import org.apache.activemq.artemis.cli.factory.security.SecurityManagerFactory;
 import org.apache.activemq.artemis.components.ExternalComponent;
-import org.apache.activemq.artemis.core.server.ActivateCallback;
+import org.apache.activemq.artemis.core.server.impl.CleaningActivateCallback;
 import org.apache.activemq.artemis.core.server.management.ManagementContext;
 import org.apache.activemq.artemis.dto.BrokerDTO;
 import org.apache.activemq.artemis.dto.ComponentDTO;
@@ -83,7 +83,7 @@ public class Run extends LockAbstract {
 
          managementContext.start();
          server.start();
-         server.getServer().registerActivateCallback(new ActivateCallback() {
+         server.getServer().registerActivateCallback(new CleaningActivateCallback() {
             @Override
             public void deActivate() {
                try {
diff --git a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java
index a05ed27..a5e6339 100644
--- a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java
+++ b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java
@@ -46,10 +46,10 @@ import org.apache.activemq.artemis.core.postoffice.BindingType;
 import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory;
 import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.security.Role;
-import org.apache.activemq.artemis.core.server.ActivateCallback;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.server.impl.AddressInfo;
+import org.apache.activemq.artemis.core.server.impl.CleaningActivateCallback;
 import org.apache.activemq.artemis.core.server.management.Notification;
 import org.apache.activemq.artemis.core.server.reload.ReloadCallback;
 import org.apache.activemq.artemis.core.server.reload.ReloadManager;
@@ -97,7 +97,7 @@ import org.w3c.dom.NodeList;
  * redeployed.
  */
 @Deprecated
-public class JMSServerManagerImpl implements JMSServerManager, ActivateCallback {
+public class JMSServerManagerImpl extends CleaningActivateCallback implements JMSServerManager {
 
    private static final String REJECT_FILTER = Filter.GENERIC_IGNORED_FILTER;
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActivateCallback.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActivateCallback.java
index f3d3820..9a646d4 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActivateCallback.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActivateCallback.java
@@ -42,4 +42,15 @@ public interface ActivateCallback {
     */
    default void activationComplete() {
    }
+
+   /*
+    * This is called when the broker is stopped (no shutdown in place)
+    */
+   default void stop(ActiveMQServer server) {
+   }
+
+   default void shutdown(ActiveMQServer server) {
+   }
+
+
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 68ca620..70a4fbf 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -1269,6 +1269,14 @@ public class ActiveMQServerImpl implements ActiveMQServer {
          this.analyzer = null;
       }
 
+      for (ActivateCallback callback: activateCallbacks) {
+         if (isShutdown) {
+            callback.shutdown(this);
+         } else {
+            callback.stop(this);
+         }
+      }
+
       if (identity != null) {
          ActiveMQServerLogger.LOGGER.serverStopped("identity=" + identity + ",version=" + getVersion().getFullVersion(), tempNodeID, getUptime());
       } else {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActivateCallback.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/CleaningActivateCallback.java
similarity index 53%
copy from artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActivateCallback.java
copy to artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/CleaningActivateCallback.java
index f3d3820..f02e30e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActivateCallback.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/CleaningActivateCallback.java
@@ -14,32 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.activemq.artemis.core.server;
 
-public interface ActivateCallback {
+package org.apache.activemq.artemis.core.server.impl;
 
-   /*
-    * this is called before any services are started when the server first initialised
-    */
-   default void preActivate() {
-   }
+import org.apache.activemq.artemis.core.server.ActivateCallback;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+
+/** This is an abstract ActivateCallback that will cleanup itself when the broker is shutodwn */
+public abstract class CleaningActivateCallback implements ActivateCallback {
 
-   /*
-    * this is called after most of the services have been started but before any cluster resources or JMS resources have been
-    */
-   default void activated() {
+   public CleaningActivateCallback() {
    }
 
-   /*
-    * this is called when the server is stopping, after any network resources and clients are closed but before the rest
-    * of the resources
-    */
-   default void deActivate() {
+   @Override
+   public void stop(ActiveMQServer server) {
+      server.unregisterActivateCallback(this);
    }
 
-   /*
-    * this is called when all resources have been started including any JMS resources
-    */
-   default void activationComplete() {
+   @Override
+   public void shutdown(ActiveMQServer server) {
+      server.unregisterActivateCallback(this);
    }
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/InVMNodeManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/InVMNodeManager.java
index a3bce41..a0e7601 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/InVMNodeManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/InVMNodeManager.java
@@ -107,7 +107,7 @@ public final class InVMNodeManager extends NodeManager {
    public ActivateCallback startLiveNode() throws Exception {
       state = FAILING_BACK;
       liveLock.acquire();
-      return new ActivateCallback() {
+      return new CleaningActivateCallback() {
          @Override
          public void activationComplete() {
             try {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java
index 322ea38..b98fd85 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java
@@ -28,6 +28,7 @@ import org.apache.activemq.artemis.core.io.IOCriticalErrorListener;
 import org.apache.activemq.artemis.core.server.ActivateCallback;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.server.NodeManager;
+import org.apache.activemq.artemis.core.server.impl.CleaningActivateCallback;
 import org.apache.activemq.artemis.jdbc.store.drivers.JDBCUtils;
 import org.apache.activemq.artemis.jdbc.store.sql.PropertySQLProvider;
 import org.apache.activemq.artemis.jdbc.store.sql.SQLProvider;
@@ -429,7 +430,7 @@ public final class JdbcNodeManager extends NodeManager {
 
          ActiveMQServerLogger.LOGGER.obtainedLiveLock();
 
-         return new ActivateCallback() {
+         return new CleaningActivateCallback() {
             @Override
             public void activationComplete() {
                LOGGER.debug("ENTER activationComplete");
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index 2ba8e4e..aa1479a 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -71,7 +71,6 @@ import org.apache.activemq.artemis.core.postoffice.PostOffice;
 import org.apache.activemq.artemis.core.remoting.server.RemotingService;
 import org.apache.activemq.artemis.core.security.Role;
 import org.apache.activemq.artemis.core.security.SecurityStore;
-import org.apache.activemq.artemis.core.server.ActivateCallback;
 import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
@@ -82,6 +81,7 @@ import org.apache.activemq.artemis.core.server.cluster.Bridge;
 import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
 import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
 import org.apache.activemq.artemis.core.server.impl.AddressInfo;
+import org.apache.activemq.artemis.core.server.impl.CleaningActivateCallback;
 import org.apache.activemq.artemis.core.server.management.ManagementService;
 import org.apache.activemq.artemis.core.server.management.Notification;
 import org.apache.activemq.artemis.core.server.management.NotificationListener;
@@ -553,7 +553,7 @@ public class ManagementServiceImpl implements ManagementService {
        * Ensure the management notification address is created otherwise if auto-create-address = false then cluster
        * bridges won't be able to connect.
        */
-      messagingServer.registerActivateCallback(new ActivateCallback() {
+      messagingServer.registerActivateCallback(new CleaningActivateCallback() {
          @Override
          public void activated() {
             try {
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeReconnectTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeReconnectTest.java
index 88c0e81..23ce8a7 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeReconnectTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeReconnectTest.java
@@ -480,7 +480,6 @@ public class BridgeReconnectTest extends BridgeTestBase {
          ClientMessage r1 = cons1.receive(30000);
          assertNotNull("received expected msg", r1);
          assertEquals("property value matches", i, r1.getObjectProperty(propKey));
-         BridgeReconnectTest.log.info("got message " + r1.getObjectProperty(propKey));
       }
 
       BridgeReconnectTest.log.info("got messages");
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/discovery/DiscoveryBaseTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/discovery/DiscoveryBaseTest.java
index 17128c7..650694f 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/discovery/DiscoveryBaseTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/discovery/DiscoveryBaseTest.java
@@ -34,6 +34,7 @@ import org.apache.activemq.artemis.core.server.ActivateCallback;
 import org.apache.activemq.artemis.core.server.NodeManager;
 import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
 import org.apache.activemq.artemis.core.server.cluster.impl.BroadcastGroupImpl;
+import org.apache.activemq.artemis.core.server.impl.CleaningActivateCallback;
 import org.apache.activemq.artemis.core.server.management.NotificationService;
 import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
@@ -194,7 +195,7 @@ public class DiscoveryBaseTest extends ActiveMQTestBase {
 
       @Override
       public ActivateCallback startLiveNode() throws Exception {
-         return new ActivateCallback() {
+         return new CleaningActivateCallback() {
          };
       }
 
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ActivationCallbackTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ActivationCallbackTest.java
new file mode 100644
index 0000000..62a233d
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ActivationCallbackTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.tests.integration.server;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.activemq.artemis.core.server.ActivateCallback;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * A simple test-case used for documentation purposes.
+ */
+public class ActivationCallbackTest extends ActiveMQTestBase {
+
+   protected ActiveMQServer server;
+
+   @Test
+   public void callbackOnShutdown() throws Exception {
+      server = createServer(false, createDefaultNettyConfig());
+      final CountDownLatch latch = new CountDownLatch(1);
+      server.registerActivateCallback(new ActivateCallback() {
+         @Override
+         public void shutdown(ActiveMQServer server) {
+            latch.countDown();
+         }
+      });
+      server.start();
+      Assert.assertEquals(1, latch.getCount());
+      server.stop();
+      Assert.assertTrue(latch.await(30, TimeUnit.SECONDS));
+   }
+}