Skip to content

Commit

Permalink
Merge pull request #289 from dromara/springmvc_support
Browse files Browse the repository at this point in the history
Springmvc support
  • Loading branch information
yanhom1314 authored Jun 26, 2023
2 parents 1c6abbf + 680efb5 commit 574a0c7
Show file tree
Hide file tree
Showing 153 changed files with 12,824 additions and 606 deletions.
61 changes: 61 additions & 0 deletions .github/workflows/build-jvmti.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: build jvmti

on: [push]

jobs:
linux:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
- name: Build with Maven
run: |
cd ${{ github.workspace }}/jvmti/jvmti-build
mvn package
- uses: actions/upload-artifact@v2
with:
name: lib
path: jvmti/jvmti-build/target/classes/lib*
if-no-files-found: error

mac:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
- name: Build with Maven
run: |
cd ${{ github.workspace }}/jvmti/jvmti-build
mvn package
- uses: actions/upload-artifact@v2
with:
name: lib
path: jvmti/jvmti-build/target/classes/lib*
if-no-files-found: error

windows:
runs-on: windows-2019
steps:
- uses: actions/checkout@v2
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
- name: Build with Maven
run: |
cd ${{ github.workspace }}/jvmti/jvmti-build
mvn package
- uses: actions/upload-artifact@v2
with:
name: lib
path: jvmti/jvmti-build/target/classes/*.dll
if-no-files-found: error
7 changes: 6 additions & 1 deletion adapter/adapter-brpc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@
<artifactId>dynamic-tp-adapter-common</artifactId>
</dependency>

<dependency>
<groupId>org.dromara.dynamictp</groupId>
<artifactId>dynamic-tp-jvmti-runtime</artifactId>
</dependency>

<dependency>
<groupId>com.baidu.cloud</groupId>
<artifactId>spring-cloud-starter-baidu-starlight</artifactId>
<artifactId>starlight-all</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,18 @@
import com.baidu.cloud.starlight.api.rpc.StarlightClient;
import com.baidu.cloud.starlight.api.rpc.threadpool.ThreadPoolFactory;
import com.baidu.cloud.starlight.core.rpc.SingleStarlightClient;
import com.baidu.cloud.starlight.springcloud.client.cluster.SingleStarlightClientManager;
import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter;
import org.dromara.dynamictp.common.ApplicationContextHolder;
import org.dromara.dynamictp.core.support.ExecutorWrapper;
import org.dromara.dynamictp.common.properties.DtpProperties;
import org.dromara.dynamictp.common.util.ReflectionUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter;
import org.dromara.dynamictp.common.properties.DtpProperties;
import org.dromara.dynamictp.common.util.ReflectionUtil;
import org.dromara.dynamictp.core.support.ExecutorWrapper;
import org.dromara.dynamictp.jvmti.JVMTI;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
Expand All @@ -59,22 +56,8 @@ public void refresh(DtpProperties dtpProperties) {
protected void initialize() {
super.initialize();

SingleStarlightClientManager sscManager = null;
Map<String, StarlightClient> scBeans = Maps.newHashMap();
try {
sscManager = ApplicationContextHolder.getBean(SingleStarlightClientManager.class);
scBeans = ApplicationContextHolder.getBeansOfType(StarlightClient.class);
} catch (Exception e) {
log.warn("getBean error, msg: {}", e.getMessage());
}

List<StarlightClient> starlightClients = Lists.newArrayList();
if (MapUtils.isNotEmpty(scBeans)) {
starlightClients.addAll(scBeans.values());
}
if (Objects.nonNull(sscManager) && MapUtils.isNotEmpty(sscManager.allSingleClients())) {
starlightClients.addAll(sscManager.allSingleClients().values());
}
starlightClients.addAll(Arrays.asList(JVMTI.getInstances(StarlightClient.class)));
if (CollectionUtils.isEmpty(starlightClients)) {
log.warn("Cannot find beans of type StarlightClient.");
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@
import com.baidu.cloud.starlight.core.rpc.ServerProcessor;
import com.baidu.cloud.starlight.transport.netty.NettyServer;
import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter;
import org.dromara.dynamictp.common.ApplicationContextHolder;
import org.dromara.dynamictp.core.support.ExecutorWrapper;
import org.dromara.dynamictp.common.properties.DtpProperties;
import org.dromara.dynamictp.common.util.ReflectionUtil;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.dromara.dynamictp.jvmti.JVMTI;

import java.util.Objects;

Expand Down Expand Up @@ -60,7 +60,7 @@ public void refresh(DtpProperties dtpProperties) {
protected void initialize() {
super.initialize();

val bean = ApplicationContextHolder.getBean(StarlightServer.class);
val bean = JVMTI.getInstance(StarlightServer.class);
if (!(bean instanceof DefaultStarlightServer)) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,6 @@

package org.dromara.dynamictp.adapter.common;

import org.dromara.dynamictp.common.ApplicationContextHolder;
import org.dromara.dynamictp.common.entity.NotifyPlatform;
import org.dromara.dynamictp.common.entity.ThreadPoolStats;
import org.dromara.dynamictp.common.entity.TpExecutorProps;
import org.dromara.dynamictp.common.entity.TpMainFields;
import org.dromara.dynamictp.common.properties.DtpProperties;
import org.dromara.dynamictp.common.util.StreamUtil;
import org.dromara.dynamictp.core.converter.ExecutorConverter;
import org.dromara.dynamictp.core.notifier.manager.AlarmManager;
import org.dromara.dynamictp.core.notifier.manager.NoticeManager;
import org.dromara.dynamictp.core.support.ExecutorWrapper;
import org.dromara.dynamictp.core.support.ExecutorAdapter;
import com.github.dadiyang.equator.Equator;
import com.github.dadiyang.equator.FieldInfo;
import com.github.dadiyang.equator.GetterBaseEquator;
Expand All @@ -39,21 +27,30 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.GenericApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.ResolvableType;
import org.dromara.dynamictp.common.spring.ApplicationContextHolder;
import org.dromara.dynamictp.common.entity.NotifyPlatform;
import org.dromara.dynamictp.common.entity.ThreadPoolStats;
import org.dromara.dynamictp.common.entity.TpExecutorProps;
import org.dromara.dynamictp.common.entity.TpMainFields;
import org.dromara.dynamictp.common.properties.DtpProperties;
import org.dromara.dynamictp.common.spring.OnceApplicationContextEventListener;
import org.dromara.dynamictp.common.util.StreamUtil;
import org.dromara.dynamictp.core.converter.ExecutorConverter;
import org.dromara.dynamictp.core.notifier.manager.AlarmManager;
import org.dromara.dynamictp.core.notifier.manager.NoticeManager;
import org.dromara.dynamictp.core.support.ExecutorAdapter;
import org.dromara.dynamictp.core.support.ExecutorWrapper;
import org.springframework.context.event.ContextRefreshedEvent;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ThreadPoolExecutor;

import static java.util.stream.Collectors.toList;
import static org.dromara.dynamictp.common.constant.DynamicTpConst.PROPERTIES_CHANGE_SHOW_STYLE;
import static org.dromara.dynamictp.core.notifier.manager.NotifyHelper.updateNotifyInfo;
import static java.util.stream.Collectors.toList;

/**
* AbstractDtpAdapter related
Expand All @@ -63,43 +60,20 @@
* @since 1.0.6
*/
@Slf4j
public abstract class AbstractDtpAdapter implements DtpAdapter, GenericApplicationListener {
public abstract class AbstractDtpAdapter extends OnceApplicationContextEventListener implements DtpAdapter {

private static final Equator EQUATOR = new GetterBaseEquator();

protected final Map<String, ExecutorWrapper> executors = Maps.newHashMap();

@Override
public int getOrder() {
//Compatible with Spring4.x
return Ordered.LOWEST_PRECEDENCE;
}

@Override
public boolean supportsSourceType(Class<?> sourceType) {
//Compatible with Spring4.x
return true;
}

@Override
public boolean supportsEventType(ResolvableType resolvableType) {
Class<?> type = resolvableType.getRawClass();
if (type != null) {
return ApplicationReadyEvent.class.isAssignableFrom(type);
}
return false;
}

@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationReadyEvent) {
try {
DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class);
initialize();
refresh(dtpProperties);
} catch (Exception e) {
log.error("Init third party thread pool failed.", e);
}
protected void onContextRefreshedEvent(ContextRefreshedEvent event) {
try {
DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class);
initialize();
refresh(dtpProperties);
} catch (Throwable e) {
log.error("Init third party thread pool failed.", e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

package org.dromara.dynamictp.adapter.common;

import org.dromara.dynamictp.common.ApplicationContextHolder;
import org.dromara.dynamictp.common.spring.ApplicationContextHolder;
import org.dromara.dynamictp.common.event.AlarmCheckEvent;
import org.dromara.dynamictp.common.event.CollectEvent;
import org.dromara.dynamictp.common.event.RefreshEvent;
Expand Down
6 changes: 3 additions & 3 deletions adapter/adapter-dubbo/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@

<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<artifactId>dubbo</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,18 @@
import com.alibaba.dubbo.common.extension.ExtensionLoader;
import com.alibaba.dubbo.common.store.DataStore;
import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter;
import org.dromara.dynamictp.common.spring.ApplicationContextHolder;
import org.dromara.dynamictp.common.properties.DtpProperties;
import org.dromara.dynamictp.core.support.ExecutorWrapper;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.InitializingBean;

import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicBoolean;

import static com.alibaba.dubbo.common.Constants.EXECUTOR_SERVICE_COMPONENT_KEY;

Expand All @@ -39,10 +43,29 @@
*/
@Slf4j
@SuppressWarnings("all")
public class AlibabaDubboDtpAdapter extends AbstractDtpAdapter {
public class AlibabaDubboDtpAdapter extends AbstractDtpAdapter implements InitializingBean {

private static final String NAME = "dubboTp";


private final AtomicBoolean registered = new AtomicBoolean(false);

@Override
public void afterPropertiesSet() throws Exception {
//从ApplicationReadyEvent改为ContextRefreshedEvent后,
//启动时无法dubbo获取线程池,这里直接每隔1s轮循,直至成功初始化线程池
Executors.newCachedThreadPool().submit(() -> {
while (!registered.get()) {
try {
Thread.sleep(1000);
final DtpProperties dtpProperties = ApplicationContextHolder.getBean(DtpProperties.class);
this.initialize();
this.refresh(dtpProperties);
} catch (Throwable e) {
}
}
});
}

@Override
public void refresh(DtpProperties dtpProperties) {
refresh(NAME, dtpProperties.getDubboTp(), dtpProperties.getPlatforms());
Expand All @@ -53,7 +76,7 @@ protected void initialize() {
super.initialize();
DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension();
Map<String, Object> executorMap = dataStore.get(EXECUTOR_SERVICE_COMPONENT_KEY);
if (MapUtils.isNotEmpty(executorMap)) {
if (MapUtils.isNotEmpty(executorMap) && registered.compareAndSet(false, true)) {
executorMap.forEach((k, v) -> {
val name = genTpName(k);
val executorWrapper = new ExecutorWrapper(name, (ThreadPoolExecutor) v);
Expand Down
Loading

0 comments on commit 574a0c7

Please sign in to comment.