diff --git a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java index c40c4a036..f32765c2f 100644 --- a/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java +++ b/adapter/adapter-dubbo/src/main/java/org/dromara/dynamictp/adapter/dubbo/apache/EagerThreadPoolExecutorProxy.java @@ -52,6 +52,7 @@ public EagerThreadPoolExecutorProxy(EagerThreadPoolExecutor executor) { executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, (TaskQueue) executor.getQueue(), executor.getThreadFactory(), executor.getRejectedExecutionHandler()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); this.rejectHandlerType = getRejectedExecutionHandler().getClass().getSimpleName(); setRejectedExecutionHandler(RejectHandlerGetter.getProxy(getRejectedExecutionHandler())); ((TaskQueue) getQueue()).setExecutor(this); diff --git a/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java b/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java index cfab39584..0072a0cde 100644 --- a/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java +++ b/adapter/adapter-motan/src/main/java/org/dromara/dynamictp/adapter/motan/StandardThreadExecutorProxy.java @@ -50,6 +50,7 @@ public StandardThreadExecutorProxy(StandardThreadExecutor executor) { executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, executor.getMaxSubmittedTaskCount() - executor.getMaximumPoolSize(), executor.getThreadFactory(), executor.getRejectedExecutionHandler()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); RejectedExecutionHandler handler = getRejectedExecutionHandler(); this.rejectHandlerType = handler.getClass().getSimpleName(); setRejectedExecutionHandler(RejectHandlerGetter.getProxy(handler)); diff --git a/common/src/main/java/org/dromara/dynamictp/common/util/DtpPropertiesBinderUtil.java b/common/src/main/java/org/dromara/dynamictp/common/util/DtpPropertiesBinderUtil.java index bf4cfaf7e..9fd27f6ac 100644 --- a/common/src/main/java/org/dromara/dynamictp/common/util/DtpPropertiesBinderUtil.java +++ b/common/src/main/java/org/dromara/dynamictp/common/util/DtpPropertiesBinderUtil.java @@ -28,7 +28,6 @@ import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; @@ -39,6 +38,7 @@ import static org.dromara.dynamictp.common.constant.DynamicTpConst.MAIN_PROPERTIES_PREFIX; import static org.dromara.dynamictp.common.constant.DynamicTpConst.NOTIFY_ITEMS; import static org.dromara.dynamictp.common.constant.DynamicTpConst.PLATFORM_IDS; +import static org.dromara.dynamictp.common.constant.DynamicTpConst.PLUGIN_NAMES; /** * DtpPropertiesBinderUtil related @@ -76,11 +76,12 @@ private static void tryResetCusExecutors(DtpProperties dtpProperties, Object sou String executorFieldKey = EXECUTORS_CONFIG_PREFIX + idx[0] + "]." + field.getName(); setBasicField(source, field, executor, executorFieldKey); }); - setListField(dtpProperties, executor); + setListField(dtpProperties, executor, "executors[" + idx[0] + "]"); + String prefix = MAIN_PROPERTIES_PREFIX + "." + "executors[" + idx[0] + "]"; val globalExecutorProps = dtpProperties.getGlobalExecutorProps(); - if (CollectionUtils.isEmpty(executor.getPluginNames()) && + if (!contains(prefix + ".pluginNames[0]", dtpProperties) && CollectionUtils.isNotEmpty(globalExecutorProps.getPluginNames())) { - executor.setPluginNames(globalExecutorProps.getPluginNames()); + ReflectUtil.setFieldValue(executor, PLUGIN_NAMES, globalExecutorProps.getPluginNames()); } idx[0]++; }); @@ -96,7 +97,7 @@ private static void tryResetAdapterExecutors(DtpProperties dtpProperties, Object } if (dtpPropertiesField.getType().isAssignableFrom(TpExecutorProps.class)) { tpExecutorPropFields.forEach(tpField -> setBasicField(source, tpField, dtpPropertiesField.getName(), targetObj)); - setListField(dtpProperties, targetObj); + setListField(dtpProperties, targetObj, dtpPropertiesField.getName()); } else if (dtpPropertiesField.getGenericType() instanceof ParameterizedType) { ParameterizedType paramType = (ParameterizedType) dtpPropertiesField.getGenericType(); Type[] argTypes = paramType.getActualTypeArguments(); @@ -108,7 +109,7 @@ private static void tryResetAdapterExecutors(DtpProperties dtpProperties, Object int[] idx = {0}; tpExecutorProps.forEach(tpProp -> { tpExecutorPropFields.forEach(tpField -> setBasicField(source, tpField, dtpPropertiesField.getName(), tpProp, idx)); - setListField(dtpProperties, tpProp); + setListField(dtpProperties, tpProp, dtpPropertiesField.getName() + "[" + idx[0] + "]"); idx[0]++; }); } @@ -127,6 +128,17 @@ private static Object getProperty(String key, Object environment) { return null; } + private static boolean contains(String key, Object environment) { + if (environment instanceof Environment) { + Environment env = (Environment) environment; + return env.containsProperty(key); + } else if (environment instanceof Map) { + Map properties = (Map) environment; + return properties.containsKey(key); + } + return false; + } + private static void setBasicField(Object source, Field tpPropField, String targetObjName, Object targetObj, int[] idx) { String executorFieldKey = MAIN_PROPERTIES_PREFIX + "." + targetObjName + "[" + idx[0] + "]." + tpPropField.getName(); setBasicField(source, tpPropField, targetObj, executorFieldKey); @@ -149,27 +161,22 @@ private static void setBasicField(Object source, Field tpPropField, Object targe ReflectUtil.setFieldValue(targetObj, tpPropField.getName(), globalFieldVal); } - private static void setListField(DtpProperties dtpProperties, Object fieldVal) { + private static void setListField(DtpProperties dtpProperties, Object fieldVal, String fieldName) { val globalExecutorProps = dtpProperties.getGlobalExecutorProps(); - val taskWrappers = (Collection) ReflectUtil.getFieldValue(fieldVal, "taskWrapperNames"); - if (CollectionUtils.isEmpty(taskWrappers) && + String prefix = MAIN_PROPERTIES_PREFIX + "." + fieldName; + if (!contains(prefix + ".taskWrapperNames[0]", dtpProperties) && CollectionUtils.isNotEmpty(globalExecutorProps.getTaskWrapperNames())) { ReflectUtil.setFieldValue(fieldVal, "taskWrapperNames", globalExecutorProps.getTaskWrapperNames()); } - val platformIds = (List) ReflectUtil.getFieldValue(fieldVal, PLATFORM_IDS); - if (CollectionUtils.isEmpty(platformIds) && + if (!contains(prefix + ".platformIds[0]", dtpProperties) && CollectionUtils.isNotEmpty(globalExecutorProps.getPlatformIds())) { ReflectUtil.setFieldValue(fieldVal, PLATFORM_IDS, globalExecutorProps.getPlatformIds()); } - - val notifyItems = (List) ReflectUtil.getFieldValue(fieldVal, NOTIFY_ITEMS); - if (CollectionUtils.isEmpty(notifyItems) && + if (!contains(prefix + ".notifyItems[0].type", dtpProperties) && CollectionUtils.isNotEmpty(globalExecutorProps.getNotifyItems())) { ReflectUtil.setFieldValue(fieldVal, NOTIFY_ITEMS, globalExecutorProps.getNotifyItems()); } - - val awareNames = (List) ReflectUtil.getFieldValue(fieldVal, AWARE_NAMES); - if (CollectionUtils.isEmpty(awareNames) && + if (!contains(prefix + ".awareNames[0]", dtpProperties) && CollectionUtils.isNotEmpty(globalExecutorProps.getAwareNames())) { ReflectUtil.setFieldValue(fieldVal, AWARE_NAMES, globalExecutorProps.getAwareNames()); } diff --git a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorProxy.java b/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorProxy.java index 0a3df0972..6d4f953d7 100644 --- a/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorProxy.java +++ b/core/src/main/java/org/dromara/dynamictp/core/support/ThreadPoolExecutorProxy.java @@ -51,6 +51,7 @@ public ThreadPoolExecutorProxy(ThreadPoolExecutor executor) { executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, executor.getQueue(), executor.getThreadFactory(), executor.getRejectedExecutionHandler()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); this.rejectHandlerType = getRejectedExecutionHandler().getClass().getSimpleName(); setRejectedExecutionHandler(RejectHandlerGetter.getProxy(getRejectedExecutionHandler())); } diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java index 9e3ea026c..3f4dd5b46 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/tomcat/TomcatExecutorProxy.java @@ -54,6 +54,7 @@ public TomcatExecutorProxy(ThreadPoolExecutor executor) { executor.getKeepAliveTime(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS, executor.getQueue(), executor.getThreadFactory()); setThreadRenewalDelay(executor.getThreadRenewalDelay()); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); Object handler = getRejectedExecutionHandler(executor); this.rejectHandlerType = handler.getClass().getSimpleName(); diff --git a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java index c8f728d08..3c7bd8724 100644 --- a/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java +++ b/starter/starter-adapter/starter-adapter-webserver/src/main/java/org/dromara/dynamictp/starter/adapter/webserver/undertow/EnhancedQueueExecutorProxy.java @@ -50,6 +50,7 @@ public EnhancedQueueExecutorProxy(final EnhancedQueueExecutor executor) { .setTerminationTask(executor.getTerminationTask()) .setRegisterMBean(true) .setMBeanName(executor.getMBeanName())); + allowCoreThreadTimeOut(executor.allowsCoreThreadTimeOut()); } @Override