diff --git a/koupleless-adapter-executorservice-spring-2.3/pom.xml b/koupleless-adapter-executorservice-spring-2.3/pom.xml new file mode 100644 index 000000000..b3a2bf243 --- /dev/null +++ b/koupleless-adapter-executorservice-spring-2.3/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.alipay.sofa.koupleless + koupleless-adapter + ${revision} + ../pom.xml + + koupleless-adapter-executorservice-spring-2.3 + + + 2.3.5.RELEASE + 1.8 + + + + + org.springframework.boot + spring-boot + ${spring.boot.version} + provided + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + provided + + + + com.alipay.sofa.koupleless + koupleless-base-plugin + ${revision} + provided + + + + \ No newline at end of file diff --git a/koupleless-adapter-executorservice-spring-2.3/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskExecutor.java b/koupleless-adapter-executorservice-spring-2.3/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskExecutor.java new file mode 100644 index 000000000..2759c6398 --- /dev/null +++ b/koupleless-adapter-executorservice-spring-2.3/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskExecutor.java @@ -0,0 +1,43 @@ +/* + * 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 com.alipay.sofa.koupleless.common; + +import com.alipay.sofa.koupleless.common.util.ReflectionUtils; +import com.alipay.sofa.koupleless.plugin.concurrent.KouplelessExecutorService; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadFactory; + +/** + * @author lianglipeng.llp@alibaba-inc.com + * @version $Id: KouplelessThreadPoolTaskExecutor.java, v 0.1 2024年05月13日 20:51 立蓬 Exp $ + */ +public class KouplelessThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { + + @Override + protected ExecutorService initializeExecutor(ThreadFactory threadFactory, + RejectedExecutionHandler rejectedExecutionHandler) { + + ExecutorService executorService = super.initializeExecutor(threadFactory, + rejectedExecutionHandler); + KouplelessExecutorService executor = new KouplelessExecutorService(executorService); + ReflectionUtils.setField("threadPoolExecutor", this, executor); + return executor; + } +} \ No newline at end of file diff --git a/koupleless-adapter-executorservice-spring-2.3/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.java b/koupleless-adapter-executorservice-spring-2.3/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.java new file mode 100644 index 000000000..2b2ec58c2 --- /dev/null +++ b/koupleless-adapter-executorservice-spring-2.3/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.java @@ -0,0 +1,83 @@ +/* + * 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 org.springframework.boot.autoconfigure.task; + +import com.alipay.sofa.koupleless.common.KouplelessThreadPoolTaskExecutor; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.task.TaskExecutionProperties.Shutdown; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.task.TaskExecutorBuilder; +import org.springframework.boot.task.TaskExecutorCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.task.TaskDecorator; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for {@link TaskExecutor}. + * springboot 2.3.x~2.6.x 均可以用该类覆盖 + * @author Stephane Nicoll + * @author Camille Vienot + * @since 2.1.0 + */ +@ConditionalOnClass(ThreadPoolTaskExecutor.class) +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(TaskExecutionProperties.class) +public class TaskExecutionAutoConfiguration { + + /** + * Bean name of the application {@link TaskExecutor}. + */ + public static final String APPLICATION_TASK_EXECUTOR_BEAN_NAME = "applicationTaskExecutor"; + + @Bean + @ConditionalOnMissingBean + public TaskExecutorBuilder taskExecutorBuilder(TaskExecutionProperties properties, + ObjectProvider taskExecutorCustomizers, + ObjectProvider taskDecorator) { + TaskExecutionProperties.Pool pool = properties.getPool(); + TaskExecutorBuilder builder = new TaskExecutorBuilder(); + builder = builder.queueCapacity(pool.getQueueCapacity()); + builder = builder.corePoolSize(pool.getCoreSize()); + builder = builder.maxPoolSize(pool.getMaxSize()); + builder = builder.allowCoreThreadTimeOut(pool.isAllowCoreThreadTimeout()); + builder = builder.keepAlive(pool.getKeepAlive()); + Shutdown shutdown = properties.getShutdown(); + builder = builder.awaitTermination(shutdown.isAwaitTermination()); + builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod()); + builder = builder.threadNamePrefix(properties.getThreadNamePrefix()); + builder = builder.customizers(taskExecutorCustomizers.orderedStream()::iterator); + builder = builder.taskDecorator(taskDecorator.getIfUnique()); + return builder; + } + + @Lazy + @Bean(name = { APPLICATION_TASK_EXECUTOR_BEAN_NAME, + AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME }) + @ConditionalOnMissingBean(Executor.class) + public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) { + return builder.configure(new KouplelessThreadPoolTaskExecutor()); + } +} \ No newline at end of file diff --git a/koupleless-adapter-executorservice-spring-2.7/pom.xml b/koupleless-adapter-executorservice-spring-2.7/pom.xml new file mode 100644 index 000000000..5b1c569ae --- /dev/null +++ b/koupleless-adapter-executorservice-spring-2.7/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.alipay.sofa.koupleless + koupleless-adapter + ${revision} + ../pom.xml + + + koupleless-adapter-executorservice-spring-2.7 + ${revision} + + + 2.7.0 + 1.8 + + + + + + org.springframework.boot + spring-boot + ${spring.boot.version} + provided + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + provided + + + + com.alipay.sofa.koupleless + koupleless-base-plugin + ${revision} + provided + + + \ No newline at end of file diff --git a/koupleless-adapter-executorservice-spring-2.7/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskExecutor.java b/koupleless-adapter-executorservice-spring-2.7/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskExecutor.java new file mode 100644 index 000000000..2759c6398 --- /dev/null +++ b/koupleless-adapter-executorservice-spring-2.7/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskExecutor.java @@ -0,0 +1,43 @@ +/* + * 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 com.alipay.sofa.koupleless.common; + +import com.alipay.sofa.koupleless.common.util.ReflectionUtils; +import com.alipay.sofa.koupleless.plugin.concurrent.KouplelessExecutorService; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadFactory; + +/** + * @author lianglipeng.llp@alibaba-inc.com + * @version $Id: KouplelessThreadPoolTaskExecutor.java, v 0.1 2024年05月13日 20:51 立蓬 Exp $ + */ +public class KouplelessThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { + + @Override + protected ExecutorService initializeExecutor(ThreadFactory threadFactory, + RejectedExecutionHandler rejectedExecutionHandler) { + + ExecutorService executorService = super.initializeExecutor(threadFactory, + rejectedExecutionHandler); + KouplelessExecutorService executor = new KouplelessExecutorService(executorService); + ReflectionUtils.setField("threadPoolExecutor", this, executor); + return executor; + } +} \ No newline at end of file diff --git a/koupleless-adapter-executorservice-spring-2.7/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.java b/koupleless-adapter-executorservice-spring-2.7/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.java new file mode 100644 index 000000000..c9ce3cbb3 --- /dev/null +++ b/koupleless-adapter-executorservice-spring-2.7/src/main/java/org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.java @@ -0,0 +1,85 @@ +/* + * 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 org.springframework.boot.autoconfigure.task; + +import com.alipay.sofa.koupleless.common.KouplelessThreadPoolTaskExecutor; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.task.TaskExecutionProperties.Shutdown; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.task.TaskExecutorBuilder; +import org.springframework.boot.task.TaskExecutorCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.task.TaskDecorator; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for {@link TaskExecutor}. + * springboot 2.7.x 均可以用该类覆盖 + * @author Stephane Nicoll + * @author Camille Vienot + * @since 2.1.0 + */ +@ConditionalOnClass(ThreadPoolTaskExecutor.class) +@AutoConfiguration +@EnableConfigurationProperties(TaskExecutionProperties.class) +public class TaskExecutionAutoConfiguration { + + /** + * Bean name of the application {@link TaskExecutor}. + */ + public static final String APPLICATION_TASK_EXECUTOR_BEAN_NAME = "applicationTaskExecutor"; + + @Bean + @ConditionalOnMissingBean + public TaskExecutorBuilder taskExecutorBuilder(TaskExecutionProperties properties, + ObjectProvider taskExecutorCustomizers, + ObjectProvider taskDecorator) { + TaskExecutionProperties.Pool pool = properties.getPool(); + TaskExecutorBuilder builder = new TaskExecutorBuilder(); + builder = builder.queueCapacity(pool.getQueueCapacity()); + builder = builder.corePoolSize(pool.getCoreSize()); + builder = builder.maxPoolSize(pool.getMaxSize()); + builder = builder.allowCoreThreadTimeOut(pool.isAllowCoreThreadTimeout()); + builder = builder.keepAlive(pool.getKeepAlive()); + Shutdown shutdown = properties.getShutdown(); + builder = builder.awaitTermination(shutdown.isAwaitTermination()); + builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod()); + builder = builder.threadNamePrefix(properties.getThreadNamePrefix()); + builder = builder.customizers(taskExecutorCustomizers.orderedStream()::iterator); + builder = builder.taskDecorator(taskDecorator.getIfUnique()); + return builder; + } + + @Lazy + @Bean(name = { APPLICATION_TASK_EXECUTOR_BEAN_NAME, + AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME }) + @ConditionalOnMissingBean(Executor.class) + public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) { + // 修改了此处 + return builder.configure(new KouplelessThreadPoolTaskExecutor()); + } + +} \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.3/pom.xml b/koupleless-adapter-scheduler-spring-2.3/pom.xml new file mode 100644 index 000000000..43cb3e059 --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.3/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.alipay.sofa.koupleless + koupleless-adapter + ${revision} + ../pom.xml + + + koupleless-adapter-scheduler-spring-2.3 + + + 2.3.5.RELEASE + 1.8 + + + + + org.springframework.boot + spring-boot + ${spring.boot.version} + provided + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + provided + + + + com.alipay.sofa.koupleless + koupleless-base-plugin + ${revision} + provided + + + \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.3/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.java b/koupleless-adapter-scheduler-spring-2.3/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.java new file mode 100644 index 000000000..c45a7f75f --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.3/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.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 com.alipay.sofa.koupleless.common; + +import com.alipay.sofa.koupleless.common.util.ReflectionUtils; +import com.alipay.sofa.koupleless.plugin.concurrent.KouplelessScheduledExecutorService; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; + +/** + * @author lianglipeng.llp@alibaba-inc.com + * @version $Id: KouplelessThreadPoolTaskScheduler.java, v 0.1 2024年05月13日 23:33 立蓬 Exp $ + */ +public class KouplelessThreadPoolTaskScheduler extends ThreadPoolTaskScheduler { + + @Override + protected ExecutorService initializeExecutor(ThreadFactory threadFactory, + RejectedExecutionHandler rejectedExecutionHandler) { + + ScheduledExecutorService scheduledExecutor = (ScheduledExecutorService) super.initializeExecutor( + threadFactory, rejectedExecutionHandler); + ScheduledExecutorService executor = new KouplelessScheduledExecutorService( + scheduledExecutor); + ReflectionUtils.setField("scheduledExecutor", this, executor); + return executor; + } +} \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.3/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java b/koupleless-adapter-scheduler-spring-2.3/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java new file mode 100644 index 000000000..ed4935932 --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.3/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java @@ -0,0 +1,74 @@ +/* + * 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 org.springframework.boot.autoconfigure.task; + +import java.util.concurrent.ScheduledExecutorService; + +import com.alipay.sofa.koupleless.common.KouplelessThreadPoolTaskScheduler; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.LazyInitializationExcludeFilter; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.task.TaskSchedulingProperties.Shutdown; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.task.TaskSchedulerBuilder; +import org.springframework.boot.task.TaskSchedulerCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.TaskManagementConfigUtils; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for {@link TaskScheduler}. + * springboot 2.3.x ~ 2.4.5 都可以用这个类覆盖 + * @author Stephane Nicoll + * @since 2.1.0 + */ +@ConditionalOnClass(ThreadPoolTaskScheduler.class) +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(TaskSchedulingProperties.class) +@AutoConfigureAfter(TaskExecutionAutoConfiguration.class) +public class TaskSchedulingAutoConfiguration { + + @Bean + @ConditionalOnBean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) + @ConditionalOnMissingBean({ SchedulingConfigurer.class, TaskScheduler.class, + ScheduledExecutorService.class }) + public ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) { + return builder.configure(new KouplelessThreadPoolTaskScheduler()); + } + + @Bean + @ConditionalOnMissingBean + public TaskSchedulerBuilder taskSchedulerBuilder(TaskSchedulingProperties properties, + ObjectProvider taskSchedulerCustomizers) { + TaskSchedulerBuilder builder = new TaskSchedulerBuilder(); + builder = builder.poolSize(properties.getPool().getSize()); + Shutdown shutdown = properties.getShutdown(); + builder = builder.awaitTermination(shutdown.isAwaitTermination()); + builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod()); + builder = builder.threadNamePrefix(properties.getThreadNamePrefix()); + builder = builder.customizers(taskSchedulerCustomizers); + return builder; + } + +} \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.4.6/pom.xml b/koupleless-adapter-scheduler-spring-2.4.6/pom.xml new file mode 100644 index 000000000..777e63dcf --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.4.6/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + com.alipay.sofa.koupleless + koupleless-adapter + ${revision} + ../pom.xml + + + + koupleless-adapter-scheduler-spring-2.4.6 + ${revision} + + + 2.4.6 + 1.8 + + + + + org.springframework.boot + spring-boot + ${spring.boot.version} + provided + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + provided + + + + com.alipay.sofa.koupleless + koupleless-base-plugin + ${revision} + provided + + + + \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.4.6/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.java b/koupleless-adapter-scheduler-spring-2.4.6/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.java new file mode 100644 index 000000000..c45a7f75f --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.4.6/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.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 com.alipay.sofa.koupleless.common; + +import com.alipay.sofa.koupleless.common.util.ReflectionUtils; +import com.alipay.sofa.koupleless.plugin.concurrent.KouplelessScheduledExecutorService; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; + +/** + * @author lianglipeng.llp@alibaba-inc.com + * @version $Id: KouplelessThreadPoolTaskScheduler.java, v 0.1 2024年05月13日 23:33 立蓬 Exp $ + */ +public class KouplelessThreadPoolTaskScheduler extends ThreadPoolTaskScheduler { + + @Override + protected ExecutorService initializeExecutor(ThreadFactory threadFactory, + RejectedExecutionHandler rejectedExecutionHandler) { + + ScheduledExecutorService scheduledExecutor = (ScheduledExecutorService) super.initializeExecutor( + threadFactory, rejectedExecutionHandler); + ScheduledExecutorService executor = new KouplelessScheduledExecutorService( + scheduledExecutor); + ReflectionUtils.setField("scheduledExecutor", this, executor); + return executor; + } +} \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.4.6/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java b/koupleless-adapter-scheduler-spring-2.4.6/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java new file mode 100644 index 000000000..69f64ce03 --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.4.6/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java @@ -0,0 +1,79 @@ +/* + * 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 org.springframework.boot.autoconfigure.task; + +import java.util.concurrent.ScheduledExecutorService; + +import com.alipay.sofa.koupleless.common.KouplelessThreadPoolTaskScheduler; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.LazyInitializationExcludeFilter; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.task.TaskSchedulingProperties.Shutdown; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.task.TaskSchedulerBuilder; +import org.springframework.boot.task.TaskSchedulerCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.TaskManagementConfigUtils; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for {@link TaskScheduler}. + * springboot 2.4.6 ~ 2.6.x 都可以用这个类覆盖 + * @author Stephane Nicoll + * @since 2.1.0 + */ +@ConditionalOnClass(ThreadPoolTaskScheduler.class) +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(TaskSchedulingProperties.class) +@AutoConfigureAfter(TaskExecutionAutoConfiguration.class) +public class TaskSchedulingAutoConfiguration { + + @Bean + @ConditionalOnBean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) + @ConditionalOnMissingBean({ SchedulingConfigurer.class, TaskScheduler.class, + ScheduledExecutorService.class }) + public ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) { + return builder.configure(new KouplelessThreadPoolTaskScheduler()); + } + + @Bean + public static LazyInitializationExcludeFilter scheduledBeanLazyInitializationExcludeFilter() { + return new ScheduledBeanLazyInitializationExcludeFilter(); + } + + @Bean + @ConditionalOnMissingBean + public TaskSchedulerBuilder taskSchedulerBuilder(TaskSchedulingProperties properties, + ObjectProvider taskSchedulerCustomizers) { + TaskSchedulerBuilder builder = new TaskSchedulerBuilder(); + builder = builder.poolSize(properties.getPool().getSize()); + Shutdown shutdown = properties.getShutdown(); + builder = builder.awaitTermination(shutdown.isAwaitTermination()); + builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod()); + builder = builder.threadNamePrefix(properties.getThreadNamePrefix()); + builder = builder.customizers(taskSchedulerCustomizers); + return builder; + } + +} diff --git a/koupleless-adapter-scheduler-spring-2.7/pom.xml b/koupleless-adapter-scheduler-spring-2.7/pom.xml new file mode 100644 index 000000000..2655e1114 --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.7/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + com.alipay.sofa.koupleless + koupleless-adapter + ${revision} + ../pom.xml + + + koupleless-adapter-scheduler-spring-2.7 + ${revision} + + + 2.7.0 + 1.8 + + + + + org.springframework.boot + spring-boot + ${spring.boot.version} + provided + + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + provided + + + + com.alipay.sofa.koupleless + koupleless-base-plugin + ${revision} + provided + + + \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.7/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.java b/koupleless-adapter-scheduler-spring-2.7/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.java new file mode 100644 index 000000000..c45a7f75f --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.7/src/main/java/com/alipay/sofa/koupleless/common/KouplelessThreadPoolTaskScheduler.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 com.alipay.sofa.koupleless.common; + +import com.alipay.sofa.koupleless.common.util.ReflectionUtils; +import com.alipay.sofa.koupleless.plugin.concurrent.KouplelessScheduledExecutorService; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; + +/** + * @author lianglipeng.llp@alibaba-inc.com + * @version $Id: KouplelessThreadPoolTaskScheduler.java, v 0.1 2024年05月13日 23:33 立蓬 Exp $ + */ +public class KouplelessThreadPoolTaskScheduler extends ThreadPoolTaskScheduler { + + @Override + protected ExecutorService initializeExecutor(ThreadFactory threadFactory, + RejectedExecutionHandler rejectedExecutionHandler) { + + ScheduledExecutorService scheduledExecutor = (ScheduledExecutorService) super.initializeExecutor( + threadFactory, rejectedExecutionHandler); + ScheduledExecutorService executor = new KouplelessScheduledExecutorService( + scheduledExecutor); + ReflectionUtils.setField("scheduledExecutor", this, executor); + return executor; + } +} \ No newline at end of file diff --git a/koupleless-adapter-scheduler-spring-2.7/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java b/koupleless-adapter-scheduler-spring-2.7/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java new file mode 100644 index 000000000..0f0606a58 --- /dev/null +++ b/koupleless-adapter-scheduler-spring-2.7/src/main/java/org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration.java @@ -0,0 +1,78 @@ +/* + * 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 org.springframework.boot.autoconfigure.task; + +import com.alipay.sofa.koupleless.common.KouplelessThreadPoolTaskScheduler; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.LazyInitializationExcludeFilter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.task.TaskSchedulingProperties.Shutdown; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.task.TaskSchedulerBuilder; +import org.springframework.boot.task.TaskSchedulerCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.TaskManagementConfigUtils; + +import java.util.concurrent.ScheduledExecutorService; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for {@link TaskScheduler}. + * + * @author Stephane Nicoll + * @since 2.1.0 + */ +@ConditionalOnClass(ThreadPoolTaskScheduler.class) +@AutoConfiguration(after = TaskExecutionAutoConfiguration.class) +@EnableConfigurationProperties(TaskSchedulingProperties.class) +public class TaskSchedulingAutoConfiguration { + + @Bean + @ConditionalOnBean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) + @ConditionalOnMissingBean({ SchedulingConfigurer.class, TaskScheduler.class, + ScheduledExecutorService.class }) + public ThreadPoolTaskScheduler taskScheduler(TaskSchedulerBuilder builder) { + return builder.configure(new KouplelessThreadPoolTaskScheduler()); + } + + @Bean + @ConditionalOnBean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) + public static LazyInitializationExcludeFilter scheduledBeanLazyInitializationExcludeFilter() { + return new ScheduledBeanLazyInitializationExcludeFilter(); + } + + @Bean + @ConditionalOnMissingBean + public TaskSchedulerBuilder taskSchedulerBuilder(TaskSchedulingProperties properties, + ObjectProvider taskSchedulerCustomizers) { + TaskSchedulerBuilder builder = new TaskSchedulerBuilder(); + builder = builder.poolSize(properties.getPool().getSize()); + Shutdown shutdown = properties.getShutdown(); + builder = builder.awaitTermination(shutdown.isAwaitTermination()); + builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod()); + builder = builder.threadNamePrefix(properties.getThreadNamePrefix()); + builder = builder.customizers(taskSchedulerCustomizers); + return builder; + } + +} diff --git a/pom.xml b/pom.xml index 6d5e7ed6c..9d3ee6f62 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,13 @@ koupleless-adapter-spring-boot-logback-2.7.14 koupleless-adaptor-module-resource-load-spring-boot-2.7.14 + + koupleless-adapter-scheduler-spring-2.4.6 + koupleless-adapter-scheduler-spring-2.3 + koupleless-adapter-scheduler-spring-2.7 + koupleless-adapter-executorservice-spring-2.3 + koupleless-adapter-executorservice-spring-2.7 + koupleless-adapter-log4j2-spring-starter-3.0 koupleless-adapter-log4j2-spring-starter-3.2