2

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

我遇到的问题是他们的令牌仅在 110 秒内有效,因此在此之后需要使它们失效以确保它们未被使用,我还希望消费者线程在需要令牌时立即使用令牌,这方面的任何建议都会非常有帮助。

4

2 回答 2

0

另一种方法是使用核心 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);
        }
    }
于 2019-10-24T21:33:10.093 回答
0

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

于 2019-10-24T21:22:35.880 回答