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

iluo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 0a2b9bf  Add shutdown command for telnet (#3280)
0a2b9bf is described below

commit 0a2b9bfe7c390529f3f39228879ac848e154e813
Author: LiZhen <[email protected]>
AuthorDate: Mon Jan 21 15:14:54 2019 +0800

    Add shutdown command for telnet (#3280)
    
    * telnet add shutdown command
    
    * refactor rename shutDown to shutdown
    
    * remove unregister  in doDestroy
    
    * unregister the ShutdownHook when the shutdown command invoked
---
 .../dubbo/telnet/ShutdownTelnetHandler.java        | 63 ++++++++++++++++++++++
 .../org.apache.dubbo.remoting.telnet.TelnetHandler |  3 +-
 .../dubbo/telnet/ShutdownTelnetHandlerTest.java    | 56 +++++++++++++++++++
 3 files changed, 121 insertions(+), 1 deletion(-)

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 0000000..ff5bf07
--- /dev/null
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ShutdownTelnetHandler.java
@@ -0,0 +1,63 @@
+/*
+ * 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 <milliseconds>]", 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().unregister();
+        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 ef32515..9911163 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 0000000..6dbd026
--- /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);
+    }
+
+
+}

Reply via email to