diff --git a/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java b/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java index 53b68371d..2dd769015 100644 --- a/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java +++ b/adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java @@ -41,12 +41,13 @@ import org.dromara.dynamictp.core.aware.AwareManager; import org.dromara.dynamictp.core.converter.ExecutorConverter; import org.dromara.dynamictp.core.notifier.manager.NoticeManager; -import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.ExecutorWrapper; +import org.dromara.dynamictp.core.support.adapter.ExecutorAdapter; import org.dromara.dynamictp.core.support.proxy.ThreadPoolExecutorProxy; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrapper; import org.dromara.dynamictp.core.support.task.wrapper.TaskWrappers; +import java.lang.reflect.Field; import java.util.Collections; import java.util.List; import java.util.Map; @@ -168,8 +169,18 @@ protected TpMainFields getTpMainFields(ExecutorWrapper executorWrapper, TpExecut protected void enhanceOriginExecutor(String tpName, ThreadPoolExecutor executor, String fieldName, Object targetObj) { ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor); - ReflectionUtil.setFieldValue(fieldName, targetObj, proxy); - putAndFinalize(tpName, executor, proxy); + boolean r = ReflectionUtil.setFieldValue(fieldName, targetObj, proxy); + if (r) { + putAndFinalize(tpName, executor, proxy); + } + } + + protected void enhanceOriginExecutor(String tpName, ThreadPoolExecutor executor, Field field, Object targetObj) { + ThreadPoolExecutorProxy proxy = new ThreadPoolExecutorProxy(executor); + boolean r = ReflectionUtil.setFieldValue(field, targetObj, proxy); + if (r) { + putAndFinalize(tpName, executor, proxy); + } } protected void putAndFinalize(String tpName, ExecutorService origin, Executor targetForWrapper) { diff --git a/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java b/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java index 6eea786f9..a30e03c24 100644 --- a/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java +++ b/adapter/adapter-okhttp3/src/main/java/org/dromara/dynamictp/adapter/okhttp3/Okhttp3DtpAdapter.java @@ -21,10 +21,14 @@ import lombok.val; import okhttp3.OkHttpClient; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.reflect.FieldUtils; import org.dromara.dynamictp.adapter.common.AbstractDtpAdapter; -import org.dromara.dynamictp.common.properties.DtpProperties; import org.dromara.dynamictp.common.manager.ContextManagerHelper; +import org.dromara.dynamictp.common.properties.DtpProperties; +import org.dromara.dynamictp.common.util.ReflectionUtil; +import java.lang.reflect.Field; +import java.util.Objects; import java.util.concurrent.ThreadPoolExecutor; /** @@ -40,6 +44,8 @@ public class Okhttp3DtpAdapter extends AbstractDtpAdapter { private static final String EXECUTOR_SERVICE_FIELD = "executorService"; + private static final String EXECUTOR_SERVICE_FIELD_ALTERNATIVE = "executorServiceOrNull"; + @Override public void refresh(DtpProperties dtpProperties) { refresh(dtpProperties.getOkhttp3Tp(), dtpProperties.getPlatforms()); @@ -59,10 +65,17 @@ protected void initialize() { return; } beans.forEach((k, v) -> { - val executor = v.dispatcher().executorService(); - if (executor instanceof ThreadPoolExecutor) { - enhanceOriginExecutor(genTpName(k), (ThreadPoolExecutor) executor, EXECUTOR_SERVICE_FIELD, v.dispatcher()); + val dispatcher = v.dispatcher(); + val executor = dispatcher.executorService(); + if (!(executor instanceof ThreadPoolExecutor)) { + return; + } + + Field field = FieldUtils.getField(dispatcher.getClass(), EXECUTOR_SERVICE_FIELD, true); + if (Objects.isNull(field)) { + field = ReflectionUtil.getField(dispatcher.getClass(), EXECUTOR_SERVICE_FIELD_ALTERNATIVE); } + enhanceOriginExecutor(genTpName(k), (ThreadPoolExecutor) executor, field, dispatcher); }); } diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java index 562562bff..295b29c7c 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/ReflectionUtil.java @@ -24,7 +24,6 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; - import java.util.List; import java.util.Objects; @@ -65,27 +64,31 @@ public static Object getFieldValue(Class targetClass, String fieldName, Objec } } - public static void setFieldValue(String fieldName, Object targetObj, Object targetVal) { - val field = getField(targetObj.getClass(), fieldName); + public static boolean setFieldValue(String fieldName, Object targetObj, Object targetVal) { + return setFieldValue(targetObj.getClass(), fieldName, targetObj, targetVal); + } + + public static boolean setFieldValue(Class targetClass, String fieldName, Object targetObj, Object targetVal) { + val field = getField(targetClass, fieldName); if (Objects.isNull(field)) { - return; + return false; } try { FieldUtils.writeField(field, targetObj, targetVal, true); + return true; } catch (IllegalAccessException e) { log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, fieldName, targetObj, e); + return false; } } - public static void setFieldValue(Class targetClass, String fieldName, Object targetObj, Object targetVal) { - val field = getField(targetClass, fieldName); - if (Objects.isNull(field)) { - return; - } + public static boolean setFieldValue(Field field, Object targetObj, Object targetVal) { try { FieldUtils.writeField(field, targetObj, targetVal, true); + return true; } catch (IllegalAccessException e) { - log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, fieldName, targetObj, e); + log.error("Failed to write value '{}' to field '{}' in object '{}'", targetVal, field.getName(), targetObj, e); + return false; } } @@ -102,6 +105,7 @@ public static Method findMethod(Class targetClass, String methodName, Class