From c8874064f03fd0373da3a29caef9277b883a8d59 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Sat, 5 Apr 2025 17:43:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6=E5=90=A7?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=9A=84=E9=83=BD=E7=94=A8=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ycwl/basic/config/SchedulerConfig.java | 22 +++++++++++++++++++ .../utils/ratelimiter/FixedRateLimiter.java | 7 +++--- .../ratelimiter/SlidingWindowRateLimiter.java | 6 +++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/config/SchedulerConfig.java diff --git a/src/main/java/com/ycwl/basic/config/SchedulerConfig.java b/src/main/java/com/ycwl/basic/config/SchedulerConfig.java new file mode 100644 index 0000000..7e1fd7f --- /dev/null +++ b/src/main/java/com/ycwl/basic/config/SchedulerConfig.java @@ -0,0 +1,22 @@ +package com.ycwl.basic.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + +@Configuration +@EnableScheduling +public class SchedulerConfig { + + @Bean + public ThreadPoolTaskScheduler taskScheduler() { + ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); + scheduler.setPoolSize(32); // 核心/最大线程数 + scheduler.setAwaitTerminationSeconds(0); // 空闲线程存活时间(秒) + scheduler.setThreadNamePrefix("Scheduler-"); + scheduler.setAwaitTerminationSeconds(60); // 等待任务终止的时间 + scheduler.setRemoveOnCancelPolicy(true); // 取消任务后移除线程 + return scheduler; + } +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/utils/ratelimiter/FixedRateLimiter.java b/src/main/java/com/ycwl/basic/utils/ratelimiter/FixedRateLimiter.java index 9453c58..3242c4f 100644 --- a/src/main/java/com/ycwl/basic/utils/ratelimiter/FixedRateLimiter.java +++ b/src/main/java/com/ycwl/basic/utils/ratelimiter/FixedRateLimiter.java @@ -10,17 +10,18 @@ public class FixedRateLimiter implements IRateLimiter { private final ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1); public FixedRateLimiter(float maxRequestsPerSecond) { - int rate = Float.valueOf(1000000 / maxRequestsPerSecond).intValue(); + semaphore.tryAcquire(); + int rate = Float.valueOf(1000 / maxRequestsPerSecond).intValue(); scheduler.scheduleAtFixedRate(() -> { if (semaphore.availablePermits() < 1) { semaphore.release(1); } - }, rate, rate, TimeUnit.NANOSECONDS); + }, rate, rate, TimeUnit.MILLISECONDS); } public FixedRateLimiter(int rate, TimeUnit timeUnit) { - // 启动一个线程每0.5秒释放一个许可 + semaphore.tryAcquire(); scheduler.scheduleAtFixedRate(() -> { if (semaphore.availablePermits() < 1) { semaphore.release(1); diff --git a/src/main/java/com/ycwl/basic/utils/ratelimiter/SlidingWindowRateLimiter.java b/src/main/java/com/ycwl/basic/utils/ratelimiter/SlidingWindowRateLimiter.java index adc04c8..023644a 100644 --- a/src/main/java/com/ycwl/basic/utils/ratelimiter/SlidingWindowRateLimiter.java +++ b/src/main/java/com/ycwl/basic/utils/ratelimiter/SlidingWindowRateLimiter.java @@ -12,6 +12,9 @@ public class SlidingWindowRateLimiter implements IRateLimiter { public SlidingWindowRateLimiter(int maxRequestsPerSecond) { this.semaphore = new Semaphore(maxRequestsPerSecond); + for (int i = 0; i < maxRequestsPerSecond; i++) { + semaphore.tryAcquire(); + } scheduler.scheduleAtFixedRate(() -> { if (semaphore.availablePermits() < maxRequestsPerSecond) { semaphore.release(maxRequestsPerSecond - semaphore.availablePermits()); @@ -21,6 +24,9 @@ public class SlidingWindowRateLimiter implements IRateLimiter { public SlidingWindowRateLimiter(int maxRequests, int perSecond) { this.semaphore = new Semaphore(maxRequests); + for (int i = 0; i < maxRequests; i++) { + semaphore.tryAcquire(); + } scheduler.scheduleAtFixedRate(() -> { if (semaphore.availablePermits() < maxRequests) { semaphore.release(maxRequests - semaphore.availablePermits());