From 93db5358645c186a73118b55942fbfb097d151c2 Mon Sep 17 00:00:00 2001 From: liushaofeng Date: Tue, 20 Oct 2020 09:00:50 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=9B=B4=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E4=B8=BA1.0=202.=20=E5=A2=9E=E5=8A=A0=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=B1=A0=EF=BC=8C=E8=BF=99=E6=A0=B7=E5=B0=B1=E7=AE=97?= =?UTF-8?q?=E7=94=9F=E6=88=90=E8=80=97=E6=97=B6=E8=BE=83=E9=95=BF=E7=9A=84?= =?UTF-8?q?webp=E6=A0=BC=E5=BC=8F=E7=9A=84=E6=96=87=E4=BB=B6=E4=B9=9F?= =?UTF-8?q?=E8=83=BD=E9=9D=9E=E5=B8=B8=E5=BF=AB=E9=80=9F=E7=9A=84=E5=93=8D?= =?UTF-8?q?=E5=BA=94=203.=20=E4=BC=98=E5=8C=96=E6=95=B4=E4=BD=93=E7=9A=84?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- readme.md | 2 +- .../slider/CacheSliderCaptchaTemplate.java | 44 ++++++++++--------- 3 files changed, 25 insertions(+), 23 deletions(-) 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);