Skip to content

Commit 01b2f2a

Browse files
committed
[ISSUE #524] optimize code and fix could not get thread pool for higher version okhttp3
1 parent e997ad8 commit 01b2f2a

File tree

6 files changed

+61
-28
lines changed

6 files changed

+61
-28
lines changed

adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@
4141
import org.dromara.dynamictp.core.aware.AwareManager;
4242
import org.dromara.dynamictp.core.converter.ExecutorConverter;
4343
import org.dromara.dynamictp.core.notifier.manager.NoticeManager;
44-
import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter;
4544
import org.dromara.dynamictp.core.support.ExecutorWrapper;
45+
import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter;
4646
import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy;
4747
import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper;
4848
import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers;
4949

50+
import java.lang.reflect.Field;
5051
import java.util.Collections;
5152
import java.util.List;
5253
import java.util.Map;
@@ -168,8 +169,18 @@ protected TpMainFields getTpMainFields(ExecutorWrapper executorWrapper, TpExecut
168169

169170
protected void enhanceOriginExecutor(String tpName, ThreadPoolExecutor executor, String fieldName, Object targetObj) {
170171
ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor);
171-
ReflectionUtil.setFieldValue(fieldName, targetObj, proxy);
172-
putAndFinalize(tpName, executor, proxy);
172+
boolean r = ReflectionUtil.setFieldValue(fieldName, targetObj, proxy);
173+
if (r) {
174+
putAndFinalize(tpName, executor, proxy);
175+
}
176+
}
177+
178+
protected void enhanceOriginExecutor(String tpName, ThreadPoolExecutor executor, Field field, Object targetObj) {
179+
ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor);
180+
boolean r = ReflectionUtil.setFieldValue(field, targetObj, proxy);
181+
if (r) {
182+
putAndFinalize(tpName, executor, proxy);
183+
}
173184
}
174185

175186
protected void putAndFinalize(String tpName, ExecutorService origin, Executor targetForWrapper) {

adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@
2121
import lombok.val;
2222
import okhttp3.OkHttpClient;
2323
import org.apache.commons.collections4.MapUtils;
24+
import org.apache.commons.lang3.reflect.FieldUtils;
2425
import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter;
25-
import org.dromara.dynamictp.common.properties.DtpProperties;
2626
import org.dromara.dynamictp.common.manager.ContextManagerHelper;
27+
import org.dromara.dynamictp.common.properties.DtpProperties;
28+
import org.dromara.dynamictp.common.util.ReflectionUtil;
2729

30+
import java.lang.reflect.Field;
31+
import java.util.Objects;
2832
import java.util.concurrent.ThreadPoolExecutor;
2933

3034
/**
@@ -40,6 +44,8 @@ public class Okhttp3DtpAdapter extends AbstractDtpAdapter {
4044

4145
private static final String EXECUTOR_SERVICE_FIELD = "executorService";
4246

47+
private static final String EXECUTOR_SERVICE_FIELD_ALTERNATIVE = "executorServiceOrNull";
48+
4349
@Override
4450
public void refresh(DtpProperties dtpProperties) {
4551
refresh(dtpProperties.getOkhttp3Tp(), dtpProperties.getPlatforms());
@@ -59,10 +65,17 @@ protected void initialize() {
5965
return;
6066
}
6167
beans.forEach((k, v) -> {
62-
val executor = v.dispatcher().executorService();
63-
if (executor instanceof ThreadPoolExecutor) {
64-
enhanceOriginExecutor(genTpName(k), (ThreadPoolExecutor) executor, EXECUTOR_SERVICE_FIELD, v.dispatcher());
68+
val dispatcher = v.dispatcher();
69+
val executor = dispatcher.executorService();
70+
if (!(executor instanceof ThreadPoolExecutor)) {
71+
return;
72+
}
73+
74+
Field field = FieldUtils.getField(dispatcher.getClass(), EXECUTOR_SERVICE_FIELD, true);
75+
if (Objects.isNull(field)) {
76+
field = ReflectionUtil.getField(dispatcher.getClass(), EXECUTOR_SERVICE_FIELD_ALTERNATIVE);
6577
}
78+
enhanceOriginExecutor(genTpName(k), (ThreadPoolExecutor) executor, field, dispatcher);
6679
});
6780
}
6881

common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
import java.lang.reflect.Field;
2626
import java.lang.reflect.Method;
27-
2827
import java.util.List;
2928
import java.util.Objects;
3029

@@ -65,27 +64,31 @@ public static Object getFieldValue(Class<?> targetClass, String fieldName, Objec
6564
}
6665
}
6766

68-
public static void setFieldValue(String fieldName, Object targetObj, Object targetVal) {
69-
val field = getField(targetObj.getClass(), fieldName);
67+
public static boolean setFieldValue(String fieldName, Object targetObj, Object targetVal) {
68+
return setFieldValue(targetObj.getClass(), fieldName, targetObj, targetVal);
69+
}
70+
71+
public static boolean setFieldValue(Class<?> targetClass, String fieldName, Object targetObj, Object targetVal) {
72+
val field = getField(targetClass, fieldName);
7073
if (Objects.isNull(field)) {
71-
return;
74+
return false;
7275
}
7376
try {
7477
FieldUtils.writeField(field, targetObj, targetVal, true);
78+
return true;
7579
} catch (IllegalAccessException e) {
7680
log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, fieldName, targetObj, e);
81+
return false;
7782
}
7883
}
7984

80-
public static void setFieldValue(Class<?> targetClass, String fieldName, Object targetObj, Object targetVal) {
81-
val field = getField(targetClass, fieldName);
82-
if (Objects.isNull(field)) {
83-
return;
84-
}
85+
public static boolean setFieldValue(Field field, Object targetObj, Object targetVal) {
8586
try {
8687
FieldUtils.writeField(field, targetObj, targetVal, true);
88+
return true;
8789
} catch (IllegalAccessException e) {
88-
log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, fieldName, targetObj, e);
90+
log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, field.getName(), targetObj, e);
91+
return false;
8992
}
9093
}
9194

@@ -102,6 +105,7 @@ public static Method findMethod(Class<?> targetClass, String methodName, Class<?
102105
Method method = MethodUtils.getMatchingMethod(targetClass, methodName, parameterTypes);
103106
if (Objects.isNull(method)) {
104107
log.warn("Method '{}' with parameters '{}' not found in class '{}'", methodName, parameterTypes, targetClass.getName());
108+
return null;
105109
}
106110
return method;
107111
}

spring/src/main/java/org/dromara/dynamictp/spring/holder/SpringContextHolder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public Environment getEnvironment() {
7070

7171
@Override
7272
public String getEnvironmentProperty(String key) {
73-
return getInstance().getEnvironment().getProperty(key);
73+
return getEnvironment().getProperty(key);
7474
}
7575

7676
@Override
@@ -84,6 +84,6 @@ public String getEnvironmentProperty(String key, Object environment) {
8484

8585
@Override
8686
public String getEnvironmentProperty(String key, String defaultValue) {
87-
return getInstance().getEnvironment().getProperty(key, defaultValue);
87+
return getEnvironment().getProperty(key, defaultValue);
8888
}
8989
}

spring/src/main/java/org/dromara/dynamictp/spring/initializer/SpringDtpInitializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
* SpringDtpInitializer related
3030
*
3131
* @author yanhom
32-
* @since 1.1.0
32+
* @since 1.2.0
3333
*/
3434
public class SpringDtpInitializer implements DtpInitializer {
3535

spring/src/main/java/org/dromara/dynamictp/spring/lifecycle/DtpLifecycleSpringAdapter.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.dromara.dynamictp.core.lifecycle.LifeCycleManagement;
2121
import org.springframework.context.SmartLifecycle;
2222

23+
import java.util.concurrent.atomic.AtomicBoolean;
24+
2325
/**
2426
* Adapts LifeCycleManagement to Spring's SmartLifecycle interface.
2527
*
@@ -30,33 +32,36 @@ public class DtpLifecycleSpringAdapter implements SmartLifecycle {
3032

3133
private final LifeCycleManagement lifeCycleManagement;
3234

33-
private boolean isRunning = false;
35+
private final AtomicBoolean running = new AtomicBoolean(false);
3436

3537
public DtpLifecycleSpringAdapter(LifeCycleManagement lifeCycleManagement) {
3638
this.lifeCycleManagement = lifeCycleManagement;
3739
}
3840

3941
@Override
4042
public void start() {
41-
lifeCycleManagement.start();
42-
isRunning = true;
43+
if (this.running.compareAndSet(false, true)) {
44+
lifeCycleManagement.start();
45+
}
4346
}
4447

4548
@Override
4649
public void stop() {
47-
lifeCycleManagement.stop();
48-
isRunning = false;
50+
if (this.running.compareAndSet(true, false)) {
51+
lifeCycleManagement.stop();
52+
}
4953
}
5054

5155
@Override
5256
public boolean isRunning() {
53-
return isRunning;
57+
return this.running.get();
5458
}
5559

5660
@Override
5761
public void stop(Runnable callback) {
58-
lifeCycleManagement.stop(callback);
59-
isRunning = false;
62+
if (this.running.compareAndSet(true, false)) {
63+
lifeCycleManagement.stop(callback);
64+
}
6065
}
6166

6267
/**

0 commit comments

Comments
 (0)