1.更改架构

2.增加缓存池
This commit is contained in:
liushaofeng
2020-10-19 18:39:18 +08:00
parent 588613b5e0
commit 1ba81019bd
7 changed files with 681 additions and 381 deletions
@@ -0,0 +1,115 @@
package cloud.tianai.captcha.template.slider;
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.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
private final ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("slider-captcha-queue"));
private Queue<SliderCaptchaInfo> queue;
private AtomicInteger pos = new AtomicInteger(0);
private SliderCaptchaTemplate target;
private int size;
public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, int size) {
this.target = target;
init(size);
}
private void init(int z) {
this.size = z;
this.pos = new AtomicInteger(0);
queue = new LinkedList<>();
// 初始化一个队列扫描
scheduledExecutor.scheduleAtFixedRate(() -> {
while (pos.get() < this.size) {
int count = pos.incrementAndGet();
if (count > size) {
return;
}
SliderCaptchaInfo slideImageInfo = target.getSlideImageInfo();
queue.add(slideImageInfo);
}
}, 0, 100, TimeUnit.MILLISECONDS);
}
@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;
}
}
}
// 休眠100毫秒
TimeUnit.MILLISECONDS.sleep(100);
}
}
public static void main(String[] args) throws InterruptedException {
SliderCaptchaTemplate captchaTemplate = new DefaultSliderCaptchaTemplate("webp", "webp", true);
captchaTemplate = new CacheSliderCaptchaTemplate(captchaTemplate, 20);
TimeUnit.SECONDS.sleep(5);
for (int i = 0; i < 100; i++) {
long start = System.currentTimeMillis();
SliderCaptchaInfo info = captchaTemplate.getSlideImageInfo();
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
TimeUnit.MILLISECONDS.sleep(10);
}
}
@Override
public void addResource(URL url) {
target.addResource(url);
}
@Override
public void addTemplate(Map<String, URL> template) {
target.addTemplate(template);
}
@Override
public void setResource(List<URL> resources) {
target.setResource(resources);
}
@Override
public void setTemplates(List<Map<String, URL>> imageTemplates) {
target.setTemplates(imageTemplates);
}
@Override
public void deleteResource(URL resource) {
target.deleteResource(resource);
}
@Override
public void deleteTemplate(Map<String, URL> template) {
target.deleteTemplate(template);
}
@Override
public boolean percentageContrast(Float newPercentage, Float oriPercentage) {
return target.percentageContrast(newPercentage, oriPercentage);
}
}