1. 更改版本号为1.0

2. 增加缓存池,这样就算生成耗时较长的webp格式的文件也能非常快速的响应
3. 优化整体的架构设计
This commit is contained in:
liushaofeng
2020-10-20 09:00:50 +08:00
parent 2fde83cdfb
commit 93db535864
3 changed files with 25 additions and 23 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>cloud.tianai.captcha</groupId> <groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId> <artifactId>tianai-captcha</artifactId>
<version>1.0.beta</version> <version>1.0</version>
<name>tianai-captcha</name> <name>tianai-captcha</name>
<description>滑块验证码</description> <description>滑块验证码</description>
+1 -1
View File
@@ -14,7 +14,7 @@
<dependency> <dependency>
<groupId>cloud.tianai.captcha</groupId> <groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId> <artifactId>tianai-captcha</artifactId>
<version>1.0.alpha</version> <version>1.0</version>
</dependency> </dependency>
``` ```
@@ -1,13 +1,13 @@
package cloud.tianai.captcha.template.slider; package cloud.tianai.captcha.template.slider;
import cloud.tianai.captcha.template.slider.exception.SliderCaptchaException;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.net.URL; import java.net.URL;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -16,13 +16,13 @@ import java.util.concurrent.atomic.AtomicInteger;
@Slf4j @Slf4j
public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate { public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
public static final int RETRY = 10;
private final ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("slider-captcha-queue")); private final ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("slider-captcha-queue"));
private Queue<SliderCaptchaInfo> queue; private ConcurrentLinkedQueue<SliderCaptchaInfo> queue;
private AtomicInteger pos = new AtomicInteger(0); private AtomicInteger pos = new AtomicInteger(0);
private SliderCaptchaTemplate target; private SliderCaptchaTemplate target;
private int size; private int size;
public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, int size) { public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, int size) {
this.target = target; this.target = target;
init(size); init(size);
@@ -31,7 +31,7 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
private void init(int z) { private void init(int z) {
this.size = z; this.size = z;
this.pos = new AtomicInteger(0); this.pos = new AtomicInteger(0);
queue = new LinkedList<>(); queue = new ConcurrentLinkedQueue<>();
// 初始化一个队列扫描 // 初始化一个队列扫描
scheduledExecutor.scheduleAtFixedRate(() -> { scheduledExecutor.scheduleAtFixedRate(() -> {
try { try {
@@ -41,10 +41,12 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
} }
SliderCaptchaInfo slideImageInfo = target.getSlideImageInfo(); SliderCaptchaInfo slideImageInfo = target.getSlideImageInfo();
if (slideImageInfo != null) { if (slideImageInfo != null) {
queue.add(slideImageInfo); boolean addStatus = queue.offer(slideImageInfo);
// 添加记录 if (addStatus) {
pos.incrementAndGet(); // 添加记录
}else { pos.incrementAndGet();
}
} else {
// 休眠500毫秒 // 休眠500毫秒
try { try {
TimeUnit.MILLISECONDS.sleep(500); TimeUnit.MILLISECONDS.sleep(500);
@@ -63,24 +65,24 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
@SneakyThrows @SneakyThrows
@Override @Override
public SliderCaptchaInfo getSlideImageInfo() { public SliderCaptchaInfo getSlideImageInfo() {
while (true) { SliderCaptchaInfo poll;
int i = pos.get(); int retryIdx = 0;
if (i > 0) { while ((poll = queue.poll()) == null) {
if (pos.compareAndSet(i, i - 1)) { retryIdx++;
SliderCaptchaInfo poll = queue.poll(); if (retryIdx > RETRY) {
if (poll != null) { throw new SliderCaptchaException("获取滑块验证码限流");
return poll;
}
}
} }
// 休眠100毫秒 // 休眠50毫秒
TimeUnit.MILLISECONDS.sleep(100); TimeUnit.MILLISECONDS.sleep(50);
} }
// 减1
pos.decrementAndGet();
return poll;
} }
public static void main(String[] args) throws InterruptedException { 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); captchaTemplate = new CacheSliderCaptchaTemplate(captchaTemplate, 20);
TimeUnit.SECONDS.sleep(5); TimeUnit.SECONDS.sleep(5);