This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 4848762b5f821688b27dd076f66d615f5f6a2f40 Author: ken.lj <[email protected]> AuthorDate: Wed Dec 18 16:17:21 2019 +0800 coordinate spring and dubbo shutdown hook. (#5504) --- .../org/apache/dubbo/config/DubboShutdownHook.java | 6 +-- .../dubbo/config/bootstrap/DubboBootstrap.java | 10 ++-- .../spring/extension/SpringExtensionFactory.java | 18 ------- .../spring/util/ApplicationContextUtils.java | 60 ---------------------- .../spring/util/ApplicationContextUtilsTest.java | 46 ----------------- 5 files changed, 8 insertions(+), 132 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java index 8fc2717..b35b8b9 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java @@ -25,7 +25,6 @@ import org.apache.dubbo.config.event.DubboShutdownHookRegisteredEvent; import org.apache.dubbo.config.event.DubboShutdownHookUnregisteredEvent; import org.apache.dubbo.event.Event; import org.apache.dubbo.event.EventDispatcher; -import org.apache.dubbo.registry.support.AbstractRegistryFactory; import org.apache.dubbo.rpc.Protocol; import java.util.concurrent.atomic.AtomicBoolean; @@ -113,10 +112,7 @@ public class DubboShutdownHook extends Thread { if (!destroyed.compareAndSet(false, true)) { return; } - // destroy all the registries - AbstractRegistryFactory.destroyAll(); - // destroy all the protocols - destroyProtocols(); + // dispatch the DubboDestroyedEvent @since 2.7.5 dispatch(new DubboServiceDestroyedEvent(this)); } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java index 9594dc5..c7954b5 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java @@ -155,6 +155,8 @@ public class DubboBootstrap extends GenericEventListener { private AtomicBoolean started = new AtomicBoolean(false); + private AtomicBoolean destroyed = new AtomicBoolean(false); + private volatile ServiceInstance serviceInstance; private volatile MetadataService metadataService; @@ -181,6 +183,7 @@ public class DubboBootstrap extends GenericEventListener { configManager = ApplicationModel.getConfigManager(); environment = ApplicationModel.getEnvironment(); + DubboShutdownHook.getDubboShutdownHook().register(); ShutdownHookCallbacks.INSTANCE.addCallback(new ShutdownHookCallback() { @Override public void callback() throws Throwable { @@ -189,8 +192,8 @@ public class DubboBootstrap extends GenericEventListener { }); } - public void registerShutdownHook() { - DubboShutdownHook.getDubboShutdownHook().register(); + public void unRegisterShutdownHook() { + DubboShutdownHook.getDubboShutdownHook().unregister(); } private boolean isOnlyRegisterProvider() { @@ -987,7 +990,8 @@ public class DubboBootstrap extends GenericEventListener { } public void destroy() { - if (started.compareAndSet(true, false)) { + if (started.compareAndSet(true, false) + && destroyed.compareAndSet(false, true)) { unregisterServiceInstance(); unexportMetadataService(); unexportServices(); diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java index e0f360e..a35645d 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java @@ -21,15 +21,10 @@ import org.apache.dubbo.common.extension.SPI; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ConcurrentHashSet; -import org.apache.dubbo.config.DubboShutdownHook; -import org.apache.dubbo.config.spring.util.ApplicationContextUtils; import com.alibaba.spring.util.BeanFactoryUtils; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.context.event.ContextClosedEvent; import java.util.Set; @@ -40,15 +35,12 @@ public class SpringExtensionFactory implements ExtensionFactory { private static final Logger logger = LoggerFactory.getLogger(SpringExtensionFactory.class); private static final Set<ApplicationContext> CONTEXTS = new ConcurrentHashSet<ApplicationContext>(); - private static final ApplicationListener SHUTDOWN_HOOK_LISTENER = new ShutdownHookListener(); public static void addApplicationContext(ApplicationContext context) { CONTEXTS.add(context); if (context instanceof ConfigurableApplicationContext) { ((ConfigurableApplicationContext) context).registerShutdownHook(); - DubboShutdownHook.getDubboShutdownHook().unregister(); } - ApplicationContextUtils.addApplicationListener(context, SHUTDOWN_HOOK_LISTENER); } public static void removeApplicationContext(ApplicationContext context) { @@ -84,14 +76,4 @@ public class SpringExtensionFactory implements ExtensionFactory { return null; } - - private static class ShutdownHookListener implements ApplicationListener { - @Override - public void onApplicationEvent(ApplicationEvent event) { - if (event instanceof ContextClosedEvent) { - DubboShutdownHook shutdownHook = DubboShutdownHook.getDubboShutdownHook(); - shutdownHook.doDestroy(); - } - } - } } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/ApplicationContextUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/ApplicationContextUtils.java deleted file mode 100644 index 72d1e1c..0000000 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/ApplicationContextUtils.java +++ /dev/null @@ -1,60 +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 - * - * 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.dubbo.config.spring.util; - -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationListener; -import org.springframework.context.support.AbstractApplicationContext; - -import java.lang.reflect.Method; - -/** - * {@link BeanFactory} Utilities class - * - * @see BeanFactory - * @see ConfigurableBeanFactory - * @see org.springframework.beans.factory.BeanFactoryUtils - * @since 2.5.7 - */ -public class ApplicationContextUtils { - - public static boolean addApplicationListener(ApplicationContext applicationContext, ApplicationListener listener) { - try { - // backward compatibility to spring 2.0.1 - Method method = applicationContext.getClass().getMethod("addApplicationListener", ApplicationListener.class); - method.invoke(applicationContext, listener); - return true; - } catch (Throwable t) { - if (applicationContext instanceof AbstractApplicationContext) { - try { - // backward compatibility to spring 2.0.1 - Method method = AbstractApplicationContext.class.getDeclaredMethod("addListener", ApplicationListener.class); - if (!method.isAccessible()) { - method.setAccessible(true); - } - method.invoke(applicationContext, listener); - return true; - } catch (Throwable t2) { - // ignore - } - } - } - return false; - } -} diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/util/ApplicationContextUtilsTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/util/ApplicationContextUtilsTest.java deleted file mode 100644 index b7ebb00..0000000 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/util/ApplicationContextUtilsTest.java +++ /dev/null @@ -1,46 +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 - * - * 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.dubbo.config.spring.util; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.GenericApplicationContext; - -import static org.apache.dubbo.config.spring.util.ApplicationContextUtils.addApplicationListener; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * {@link ApplicationContextUtils} Test - * - * @since 2.5.7 - */ -public class ApplicationContextUtilsTest { - - private ApplicationContext applicationContext; - - @BeforeEach - public void init() { - applicationContext = new GenericApplicationContext(); - } - - @Test - public void testAddApplicationListener() { - assertTrue(addApplicationListener(applicationContext, event -> { - })); - } -}
