如何在100秒后或调用一次后将字符串值返回为null



创建消费者-生产者类型的关系以获取和使用Recaptcha v2令牌进行网络抓取的最佳方式是什么?我有一个基本的chrome扩展,用于获取这些令牌,然后通过本地托管的web服务器将这些令牌提交给我的java应用程序。

我遇到的问题是,他们的代币仅对110有效,因此在此之后需要将其作废,以确保它们不会被使用。我还希望消费者线程在代币可用时尽快消费代币,如果他们需要的话,这方面的任何建议都将非常有帮助。

您可以尝试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秒后从缓存中删除

另一种方法是使用核心java类和lambda。

AtomicReference<String> myToken = new AtomicReference<>();
ScheduledFuture future;
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

在代码的其他地方,当你需要它时,你会看到它是否为null,并在必要时获得另一个。

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);
}
}

最新更新