kylixs commented on a change in pull request #9138: URL: https://github.com/apache/dubbo/pull/9138#discussion_r743379056
########## File path: dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/registrycenter/processor/FindPidWindowsProcessor.java ########## @@ -0,0 +1,103 @@ +/* + * 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.test.check.registrycenter.processor; + +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.Executor; +import org.apache.commons.exec.PumpStreamHandler; +import org.apache.dubbo.common.logger.Logger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.StringUtils; +import org.apache.dubbo.test.check.exception.DubboTestException; +import org.apache.dubbo.test.check.registrycenter.context.ZookeeperWindowsContext; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + + +/** + * Create a {@link org.apache.dubbo.test.check.registrycenter.Processor} to find pid on Windows OS. + */ +public class FindPidWindowsProcessor extends ZookeeperWindowsProcessor { + + private static final Logger logger = LoggerFactory.getLogger(FindPidWindowsProcessor.class); + + @Override + protected void doProcess(ZookeeperWindowsContext context) throws DubboTestException { + for (int clientPort : context.getClientPorts()) { + this.findPid(context, clientPort); + } + } + + /** + * Find the pid of zookeeper instance. + * + * @param context the global context. + * @param clientPort the client port of zookeeper instance. + */ + private void findPid(ZookeeperWindowsContext context, int clientPort) { + logger.info(String.format("Find the pid of the zookeeper with port %d", clientPort)); + Executor executor = new DefaultExecutor(); + executor.setExitValues(null); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayOutputStream ins = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(ins.toByteArray()); + executor.setStreamHandler(new PumpStreamHandler(out, null, in)); + CommandLine cmdLine = new CommandLine("cmd.exe"); + cmdLine.addArgument("/c"); + cmdLine.addArgument("netstat -ano | findstr " + clientPort); + try { + executor.execute(cmdLine); + String result = out.toString(); + logger.info(String.format("Find result: %s", result)); + if (StringUtils.isNotEmpty(result)) { + String[] values = result.split("\\r\\n"); + if (values != null && values.length > 0) { + for (int i = 0; i < values.length; i++) { + String[] segments = values[i].split(" "); Review comment: Pls add a sample result as comment for readable. The second column is "Local Address", do not use the third column which is "Foreign Address". ########## File path: dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/registrycenter/processor/KillProcessWindowsProcessor.java ########## @@ -0,0 +1,59 @@ +/* + * 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.test.check.registrycenter.processor; + +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.Executor; +import org.apache.commons.exec.PumpStreamHandler; +import org.apache.dubbo.common.logger.Logger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.test.check.exception.DubboTestException; +import org.apache.dubbo.test.check.registrycenter.context.ZookeeperWindowsContext; + +import java.io.IOException; + +/** + * Create a {@link org.apache.dubbo.test.check.registrycenter.Processor} to kill pid on Windows OS. + */ +public class KillProcessWindowsProcessor extends ZookeeperWindowsProcessor { + + private static final Logger logger = LoggerFactory.getLogger(KillProcessWindowsProcessor.class); + + @Override + protected void doProcess(ZookeeperWindowsContext context) throws DubboTestException { + for (int clientPort : context.getClientPorts()) { + Integer pid = context.getPid(clientPort); Review comment: The pid of client port should be clear immediately after kill it, os may reuse this pid when creating a new process later, and it cannot be killed next time. ########## File path: dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/integration/multiple/exportmetadata/MultipleRegistryCenterExportMetadataIntegrationTest.java ########## @@ -99,13 +91,9 @@ public void setUp() throws Exception { DubboBootstrap.getInstance() .application(new ApplicationConfig(PROVIDER_APPLICATION_NAME)) .protocol(new ProtocolConfig(PROTOCOL_NAME)) - .service(serviceConfig); - for (RegistryCenter.Instance instance : registryCenter.getRegistryCenterInstance()) { - DubboBootstrap.getInstance().registry(new RegistryConfig(String.format("%s://%s:%s", - instance.getType(), - instance.getHostname(), - instance.getPort()))); - } + .service(serviceConfig) + .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) + .registry(new RegistryConfig("zookeeper://127.0.0.1:2182")); Review comment: Is it possible to define global zk server port/address variables and then quote them in test? It is better not to use the port 2181 by default to avoid port conflicts on the zk server. Just a suggestion. ########## File path: dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/registrycenter/MockedRegistryCenter.java ########## @@ -21,6 +21,16 @@ */ public class MockedRegistryCenter { Review comment: It is not a mock register center, it is real. Better to rename it ########## File path: dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/registrycenter/MockedRegistryCenter.java ########## @@ -21,6 +21,16 @@ */ public class MockedRegistryCenter { + /** + * The first global zookeeper address + */ + public static final String ZOOKEEPER_ADDRESS1 = "zookeeper://127.0.0.1:2181"; Review comment: The global zookeeper address configs should not mixed with embedded zk server, extract them into a outer class. Furthermore, I thank it's better to append the zk server address and port configs to system props, such as: ``` zookeeper.address=zookeeper://127.0.0.1:2181 zookeeper.port=2181 zookeeper.address.1=zookeeper://127.0.0.1:2181 zookeeper.port.1=2181 zookeeper.address.2=zookeeper://127.0.0.1:2181 zookeeper.port.2=2181 ``` So we can use them in Spring application.properties/yaml: ``` dubbo.registry.address=${zookeeper.address} dubbo.registries.second-registry.address=${zookeeper.address.2} ``` ########## File path: dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/registrycenter/MockedRegistryCenter.java ########## @@ -21,6 +21,16 @@ */ public class MockedRegistryCenter { + /** + * The first global zookeeper address + */ + public static final String ZOOKEEPER_ADDRESS1 = "zookeeper://127.0.0.1:2181"; Review comment: The global zookeeper address configs should not mixed with embedded zk server, extract them into a outer class. Furthermore, I thank it's better to append the zk server address and port configs to system props, such as: ``` zookeeper.address=zookeeper://127.0.0.1:2181 zookeeper.port=2181 zookeeper.address.1=zookeeper://127.0.0.1:2181 zookeeper.port.1=2181 zookeeper.address.2=zookeeper://127.0.0.1:2182 zookeeper.port.2=2182 ``` So we can use them in Spring application.properties/yaml: ``` dubbo.registry.address=${zookeeper.address} dubbo.registries.second-registry.address=${zookeeper.address.2} ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
