From c64ba188b9f5b0683e185da4aa7c4efe87ae1f22 Mon Sep 17 00:00:00 2001 From: lizhen Date: Sun, 20 Jan 2019 18:05:43 +0800 Subject: [PATCH 1/4] telnet add shutdown command --- .../dubbo/config/DubboShutdownHook.java | 2 + .../dubbo/telnet/ShutDownTelnetHandler.java | 62 +++++++++++++++++++ ...apache.dubbo.remoting.telnet.TelnetHandler | 3 +- .../telnet/ShutDownTelnetHandlerTest.java | 56 +++++++++++++++++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandler.java create mode 100644 dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandlerTest.java 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 22d50dd05d4..8ddd1118993 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 @@ -85,6 +85,8 @@ public void doDestroy() { if (!destroyed.compareAndSet(false, true)) { return; } + // unregister the shutdownHook + unregister(); // destroy all the registries AbstractRegistryFactory.destroyAll(); // destroy all the protocols diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandler.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandler.java new file mode 100644 index 00000000000..c75db16f8d6 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandler.java @@ -0,0 +1,62 @@ +/* + * 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.rpc.protocol.dubbo.telnet; + +import org.apache.dubbo.common.extension.Activate; +import org.apache.dubbo.common.utils.StringUtils; +import org.apache.dubbo.config.DubboShutdownHook; +import org.apache.dubbo.remoting.Channel; +import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.remoting.telnet.TelnetHandler; +import org.apache.dubbo.remoting.telnet.support.Help; + +/** + * ShutDownTelnetHandler + */ +@Activate +@Help(parameter = "[-t ]", summary = "Shutdown Dubbo Application.", detail = "Shutdown Dubbo Application.") +public class ShutDownTelnetHandler implements TelnetHandler { + @Override + public String telnet(Channel channel, String message) throws RemotingException { + + int sleepMilliseconds = 0; + if (StringUtils.isNotEmpty(message)) { + String[] parameters = message.split("\\s+"); + if (parameters.length == 2 && parameters[0].equals("-t") && StringUtils.isInteger(parameters[1])) { + sleepMilliseconds = Integer.parseInt(parameters[1]); + } else { + return "Invalid parameter,please input like shutdown -t 10000"; + } + } + long start = System.currentTimeMillis(); + if (sleepMilliseconds > 0) { + try { + Thread.sleep(sleepMilliseconds); + } catch (InterruptedException e) { + return "Failed to invoke shutdown command, cause: " + e.getMessage(); + } + } + StringBuilder buf = new StringBuilder(); + DubboShutdownHook.getDubboShutdownHook().doDestroy(); + long end = System.currentTimeMillis(); + buf.append("Application has shutdown successfully"); + buf.append("\r\nelapsed: "); + buf.append(end - start); + buf.append(" ms."); + return buf.toString(); + } +} diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler b/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler index ef32515fe7a..2d856ad9887 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler @@ -5,4 +5,5 @@ pwd=org.apache.dubbo.rpc.protocol.dubbo.telnet.CurrentTelnetHandler invoke=org.apache.dubbo.rpc.protocol.dubbo.telnet.InvokeTelnetHandler trace=org.apache.dubbo.rpc.protocol.dubbo.telnet.TraceTelnetHandler count=org.apache.dubbo.rpc.protocol.dubbo.telnet.CountTelnetHandler -select=org.apache.dubbo.rpc.protocol.dubbo.telnet.SelectTelnetHandler \ No newline at end of file +select=org.apache.dubbo.rpc.protocol.dubbo.telnet.SelectTelnetHandler +shutdown=org.apache.dubbo.rpc.protocol.dubbo.telnet.ShutDownTelnetHandler \ No newline at end of file diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandlerTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandlerTest.java new file mode 100644 index 00000000000..4e2d8578875 --- /dev/null +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandlerTest.java @@ -0,0 +1,56 @@ +/* + * 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.rpc.protocol.dubbo.telnet; + +import org.apache.dubbo.remoting.Channel; +import org.apache.dubbo.remoting.RemotingException; +import org.apache.dubbo.remoting.telnet.TelnetHandler; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; + +/** + * SelectTelnetHandlerTest.java + */ +public class ShutDownTelnetHandlerTest { + + private static TelnetHandler handler = new ShutDownTelnetHandler(); + private Channel mockChannel; + + @SuppressWarnings("unchecked") + @Test + public void testInvoke() throws RemotingException { + mockChannel = mock(Channel.class); + String result = handler.telnet(mockChannel, ""); + assertTrue(result.contains("Application has shutdown successfully")); + } + + + @SuppressWarnings("unchecked") + @Test + public void testInvokeWithTimeParameter() throws RemotingException { + mockChannel = mock(Channel.class); + int sleepTime = 2000; + long start = System.currentTimeMillis(); + String result = handler.telnet(mockChannel, "-t " + sleepTime); + long end = System.currentTimeMillis(); + assertTrue(result.contains("Application has shutdown successfully") && (end - start) > sleepTime); + } + + +} From e29df9e62c2c9859cf9231c0ec283922544f045f Mon Sep 17 00:00:00 2001 From: lizhen Date: Sun, 20 Jan 2019 21:11:07 +0800 Subject: [PATCH 2/4] refactor rename shutDown to shutdown --- ...{ShutDownTelnetHandler.java => ShutdownTelnetHandler.java} | 4 ++-- .../internal/org.apache.dubbo.remoting.telnet.TelnetHandler | 2 +- ...nTelnetHandlerTest.java => ShutdownTelnetHandlerTest.java} | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/{ShutDownTelnetHandler.java => ShutdownTelnetHandler.java} (96%) rename dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/{ShutDownTelnetHandlerTest.java => ShutdownTelnetHandlerTest.java} (94%) diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandler.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java similarity index 96% rename from dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandler.java rename to dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java index c75db16f8d6..26eb085bcfc 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandler.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java @@ -25,11 +25,11 @@ import org.apache.dubbo.remoting.telnet.support.Help; /** - * ShutDownTelnetHandler + * ShutdownTelnetHandler */ @Activate @Help(parameter = "[-t ]", summary = "Shutdown Dubbo Application.", detail = "Shutdown Dubbo Application.") -public class ShutDownTelnetHandler implements TelnetHandler { +public class ShutdownTelnetHandler implements TelnetHandler { @Override public String telnet(Channel channel, String message) throws RemotingException { diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler b/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler index 2d856ad9887..99111639c26 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler @@ -6,4 +6,4 @@ invoke=org.apache.dubbo.rpc.protocol.dubbo.telnet.InvokeTelnetHandler trace=org.apache.dubbo.rpc.protocol.dubbo.telnet.TraceTelnetHandler count=org.apache.dubbo.rpc.protocol.dubbo.telnet.CountTelnetHandler select=org.apache.dubbo.rpc.protocol.dubbo.telnet.SelectTelnetHandler -shutdown=org.apache.dubbo.rpc.protocol.dubbo.telnet.ShutDownTelnetHandler \ No newline at end of file +shutdown=org.apache.dubbo.rpc.protocol.dubbo.telnet.ShutdownTelnetHandler \ No newline at end of file diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandlerTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandlerTest.java similarity index 94% rename from dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandlerTest.java rename to dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandlerTest.java index 4e2d8578875..6dbd026300e 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutDownTelnetHandlerTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandlerTest.java @@ -27,9 +27,9 @@ /** * SelectTelnetHandlerTest.java */ -public class ShutDownTelnetHandlerTest { +public class ShutdownTelnetHandlerTest { - private static TelnetHandler handler = new ShutDownTelnetHandler(); + private static TelnetHandler handler = new ShutdownTelnetHandler(); private Channel mockChannel; @SuppressWarnings("unchecked") From dc58b3a1eb2482a36e76bf946b2837fdb573c65c Mon Sep 17 00:00:00 2001 From: lizhen Date: Mon, 21 Jan 2019 14:19:15 +0800 Subject: [PATCH 3/4] remove unregister in doDestroy --- .../main/java/org/apache/dubbo/config/DubboShutdownHook.java | 2 -- 1 file changed, 2 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 8ddd1118993..22d50dd05d4 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 @@ -85,8 +85,6 @@ public void doDestroy() { if (!destroyed.compareAndSet(false, true)) { return; } - // unregister the shutdownHook - unregister(); // destroy all the registries AbstractRegistryFactory.destroyAll(); // destroy all the protocols From 252e4d407e0648a8cd2c3feeb5ec901986be6af2 Mon Sep 17 00:00:00 2001 From: lizhen Date: Mon, 21 Jan 2019 14:42:02 +0800 Subject: [PATCH 4/4] unregister the ShutdownHook when the shutdown command invoked --- .../dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java index 26eb085bcfc..ff5bf07cb33 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java @@ -51,6 +51,7 @@ public String telnet(Channel channel, String message) throws RemotingException { } } StringBuilder buf = new StringBuilder(); + DubboShutdownHook.getDubboShutdownHook().unregister(); DubboShutdownHook.getDubboShutdownHook().doDestroy(); long end = System.currentTimeMillis(); buf.append("Application has shutdown successfully");