diff --git a/hippo4j-adapter/hippo4j-adapter-dubbo-alibaba/pom.xml b/hippo4j-adapter/hippo4j-adapter-dubbo-alibaba/pom.xml new file mode 100644 index 00000000..d9d659ff --- /dev/null +++ b/hippo4j-adapter/hippo4j-adapter-dubbo-alibaba/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + cn.hippo4j + hippo4j-adapter + ${revision} + + hippo4j-adapter-dubbo-alibaba + 1.4.0-SNAPSHOT + + + 3.0.5 + + + + + cn.hippo4j + hippo4j-adapter-base + + + + + com.alibaba + dubbo + 2.6.12 + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + ${project.artifactId} + ${project.version} + ${maven.build.timestamp} + chen.ma + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + + jar + + + + + + + diff --git a/hippo4j-adapter/hippo4j-adapter-dubbo-alibaba/src/main/java/cn/hippo4j/adapter/dubbo/AlibabaDubboThreadPoolAdapter.java b/hippo4j-adapter/hippo4j-adapter-dubbo-alibaba/src/main/java/cn/hippo4j/adapter/dubbo/AlibabaDubboThreadPoolAdapter.java new file mode 100644 index 00000000..2cef6723 --- /dev/null +++ b/hippo4j-adapter/hippo4j-adapter-dubbo-alibaba/src/main/java/cn/hippo4j/adapter/dubbo/AlibabaDubboThreadPoolAdapter.java @@ -0,0 +1,102 @@ +/* + * 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 cn.hippo4j.adapter.dubbo; + +import cn.hippo4j.adapter.base.ThreadPoolAdapter; +import cn.hippo4j.adapter.base.ThreadPoolAdapterParameter; +import cn.hippo4j.adapter.base.ThreadPoolAdapterState; +import com.alibaba.dubbo.common.extension.ExtensionLoader; +import com.alibaba.dubbo.common.store.DataStore; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.context.ApplicationListener; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; + +import static cn.hippo4j.common.constant.ChangeThreadPoolConstants.CHANGE_DELIMITER; + +/** + * Alibaba Dubbo thread-pool adapter. + */ +@Slf4j +public class AlibabaDubboThreadPoolAdapter implements ThreadPoolAdapter, ApplicationListener { + + private final Map DUBBO_PROTOCOL_EXECUTOR = Maps.newHashMap(); + + @Override + public String mark() { + return "Dubbo"; + } + + @Override + public ThreadPoolAdapterState getThreadPoolState(String identify) { + ThreadPoolAdapterState threadPoolAdapterState = new ThreadPoolAdapterState(); + ThreadPoolExecutor executor = DUBBO_PROTOCOL_EXECUTOR.get(identify); + if (executor == null) { + log.warn("[{}] Alibaba Dubbo consuming thread pool not found.", identify); + return threadPoolAdapterState; + } + threadPoolAdapterState.setThreadPoolKey(identify); + threadPoolAdapterState.setCoreSize(executor.getCorePoolSize()); + threadPoolAdapterState.setMaximumSize(executor.getMaximumPoolSize()); + return threadPoolAdapterState; + } + + @Override + public List getThreadPoolStates() { + List threadPoolAdapterStates = new ArrayList<>(); + DUBBO_PROTOCOL_EXECUTOR.forEach((kel, val) -> threadPoolAdapterStates.add(getThreadPoolState(String.valueOf(val)))); + return threadPoolAdapterStates; + } + + @Override + public boolean updateThreadPool(ThreadPoolAdapterParameter threadPoolAdapterParameter) { + String threadPoolKey = threadPoolAdapterParameter.getThreadPoolKey(); + ThreadPoolExecutor executor = DUBBO_PROTOCOL_EXECUTOR.get(threadPoolAdapterParameter.getThreadPoolKey()); + if (executor == null) { + log.warn("[{}] Alibaba Dubbo consuming thread pool not found.", threadPoolKey); + return false; + } + int originalCoreSize = executor.getCorePoolSize(); + int originalMaximumPoolSize = executor.getMaximumPoolSize(); + executor.setCorePoolSize(threadPoolAdapterParameter.getCorePoolSize()); + executor.setMaximumPoolSize(threadPoolAdapterParameter.getMaximumPoolSize()); + log.info("[{}] Alibaba Dubbo consumption thread pool parameter change. coreSize: {}, maximumSize: {}", + threadPoolKey, + String.format(CHANGE_DELIMITER, originalCoreSize, executor.getCorePoolSize()), + String.format(CHANGE_DELIMITER, originalMaximumPoolSize, executor.getMaximumPoolSize())); + return true; + } + + @Override + public void onApplicationEvent(ApplicationStartedEvent event) { + String poolKey = ExecutorService.class.getName(); + try { + DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); + Map executors = dataStore.get(poolKey); + executors.forEach((key, value) -> DUBBO_PROTOCOL_EXECUTOR.put(key, (ThreadPoolExecutor) value)); + } catch (Exception ex) { + log.error("Failed to get Alibaba Dubbo protocol thread pool", ex); + } + } +} diff --git a/hippo4j-adapter/pom.xml b/hippo4j-adapter/pom.xml index ce2bd837..570fbf22 100644 --- a/hippo4j-adapter/pom.xml +++ b/hippo4j-adapter/pom.xml @@ -13,6 +13,7 @@ hippo4j-adapter-base hippo4j-adapter-dubbo + hippo4j-adapter-dubbo-alibaba hippo4j-adapter-kafka hippo4j-adapter-rabbitmq hippo4j-adapter-rocketmq diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/pom.xml new file mode 100644 index 00000000..b4a58c63 --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + cn.hippo4j + hippo4j-spring-boot-starter-adapter + ${revision} + + hippo4j-spring-boot-starter-adapter-dubbo-alibaba + + + + + cn.hippo4j + hippo4j-adapter-dubbo-alibaba + ${revision} + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + ${project.artifactId} + ${project.version} + ${maven.build.timestamp} + chen.ma + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + + jar + + + + + + + diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/AlibabaDubboAdapterAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/AlibabaDubboAdapterAutoConfiguration.java new file mode 100644 index 00000000..f3a0718d --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/src/main/java/cn/hippo4j/springboot/starter/adapter/dubbo/AlibabaDubboAdapterAutoConfiguration.java @@ -0,0 +1,45 @@ +/* + * 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 cn.hippo4j.springboot.starter.adapter.dubbo; + +import cn.hippo4j.adapter.dubbo.AlibabaDubboThreadPoolAdapter; +import cn.hippo4j.common.config.ApplicationContextHolder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Alibaba Dubbo adapter auto configuration. + */ +@Configuration +public class AlibabaDubboAdapterAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public ApplicationContextHolder simpleApplicationContextHolder() { + return new ApplicationContextHolder(); + } + + @Bean + @SuppressWarnings("all") + @ConditionalOnProperty(name = "dubbo.application.name") + public AlibabaDubboThreadPoolAdapter dubboThreadPoolAdapter(ApplicationContextHolder applicationContextHolder) { + return new AlibabaDubboThreadPoolAdapter(); + } +} diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/src/main/resources/META-INF/spring.factories b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..b5db5ad1 --- /dev/null +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/hippo4j-spring-boot-starter-adapter-dubbo-alibaba/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.hippo4j.springboot.starter.adapter.dubbo.AlibabaDubboAdapterAutoConfiguration diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml index c319c935..81de1ed2 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter-adapter/pom.xml @@ -15,6 +15,7 @@ hippo4j-spring-boot-starter-adapter-all hippo4j-spring-boot-starter-adapter-dubbo + hippo4j-spring-boot-starter-adapter-dubbo-alibaba hippo4j-spring-boot-starter-adapter-kafka hippo4j-spring-boot-starter-adapter-rabbitmq hippo4j-spring-boot-starter-adapter-rocketmq