diff --git a/pom.xml b/pom.xml index d53c137..6be7170 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 cloud.tianai.captcha tianai-captcha - 1.0.beta + 1.0 tianai-captcha 滑块验证码 diff --git a/readme.md b/readme.md index 7b5cda2..7f4ef53 100644 --- a/readme.md +++ b/readme.md @@ -14,7 +14,7 @@ cloud.tianai.captcha tianai-captcha - 1.0.alpha + 1.0 ``` diff --git a/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java index 1d93b22..73433b7 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java +++ b/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java @@ -1,13 +1,13 @@ package cloud.tianai.captcha.template.slider; +import cloud.tianai.captcha.template.slider.exception.SliderCaptchaException; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import java.net.URL; -import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -16,13 +16,13 @@ import java.util.concurrent.atomic.AtomicInteger; @Slf4j public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate { + public static final int RETRY = 10; private final ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("slider-captcha-queue")); - private Queue queue; + private ConcurrentLinkedQueue queue; private AtomicInteger pos = new AtomicInteger(0); private SliderCaptchaTemplate target; private int size; - public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, int size) { this.target = target; init(size); @@ -31,7 +31,7 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate { private void init(int z) { this.size = z; this.pos = new AtomicInteger(0); - queue = new LinkedList<>(); + queue = new ConcurrentLinkedQueue<>(); // 初始化一个队列扫描 scheduledExecutor.scheduleAtFixedRate(() -> { try { @@ -41,10 +41,12 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate { } SliderCaptchaInfo slideImageInfo = target.getSlideImageInfo(); if (slideImageInfo != null) { - queue.add(slideImageInfo); - // 添加记录 - pos.incrementAndGet(); - }else { + boolean addStatus = queue.offer(slideImageInfo); + if (addStatus) { + // 添加记录 + pos.incrementAndGet(); + } + } else { // 休眠500毫秒 try { TimeUnit.MILLISECONDS.sleep(500); @@ -63,24 +65,24 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate { @SneakyThrows @Override public SliderCaptchaInfo getSlideImageInfo() { - while (true) { - int i = pos.get(); - if (i > 0) { - if (pos.compareAndSet(i, i - 1)) { - SliderCaptchaInfo poll = queue.poll(); - if (poll != null) { - return poll; - } - } + SliderCaptchaInfo poll; + int retryIdx = 0; + while ((poll = queue.poll()) == null) { + retryIdx++; + if (retryIdx > RETRY) { + throw new SliderCaptchaException("获取滑块验证码限流"); } - // 休眠100毫秒 - TimeUnit.MILLISECONDS.sleep(100); + // 休眠50毫秒 + TimeUnit.MILLISECONDS.sleep(50); } + // 减1 + pos.decrementAndGet(); + return poll; } public static void main(String[] args) throws InterruptedException { - SliderCaptchaTemplate captchaTemplate = new DefaultSliderCaptchaTemplate("webp", "webp", true); + SliderCaptchaTemplate captchaTemplate = new DefaultSliderCaptchaTemplate("jpeg", "png", true); captchaTemplate = new CacheSliderCaptchaTemplate(captchaTemplate, 20); TimeUnit.SECONDS.sleep(5);