创建消费者-生产者类型关系以获取和使用 Recaptcha v2 令牌进行网络抓取的最佳方法是什么,我有一个基本的 chrome 扩展,可以在其中获取这些令牌,然后通过本地托管提交到我的 java 应用程序网络服务器。
我遇到的问题是他们的令牌仅在 110 秒内有效,因此在此之后需要使它们失效以确保它们未被使用,我还希望消费者线程在需要令牌时立即使用令牌,这方面的任何建议都会非常有帮助。
创建消费者-生产者类型关系以获取和使用 Recaptcha v2 令牌进行网络抓取的最佳方法是什么,我有一个基本的 chrome 扩展,可以在其中获取这些令牌,然后通过本地托管提交到我的 java 应用程序网络服务器。
我遇到的问题是他们的令牌仅在 110 秒内有效,因此在此之后需要使它们失效以确保它们未被使用,我还希望消费者线程在需要令牌时立即使用令牌,这方面的任何建议都会非常有帮助。
另一种方法是使用核心 Java 类和 lambda。
AtomicReference<String> myToken = new AtomicReference<>();
ScheduledFuture future;
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
在您的代码的其他地方,您会在需要时查看它是否为空,并在必要时获取另一个。
String tokenValue = myToken.getAndSet(null);
if (tokenValue == null) {
tokenValue = "anothertokenvalue";
myToken.set(tokenValue);
future = exec.schedule(() -> myToken.set(null), 100, TimeUnit.SECONDS);
} else {
if (future != null) {
future.cancel(true);
}
}
你可以试试 Guava CacheBuilder
例如;
初始化令牌存储;
final Cache<String, String> tokens = CacheBuilder.newBuilder()
.expireAfterWrite(100, TimeUnit.SECONDS)
.build();
放一些代币;
tokens.put("TOKEN_1", "TOKEN_1");
tokens.put("TOKEN_2", "TOKEN_2");
使用后取出令牌;
synchronized (tokens) {
tokens.getIfPresent("USED_TOKEN");
tokens.invalidate("USED_TOKEN");
}
即使不使用它们也会在 100 秒后从缓存中删除