@Override
    public void init() throws IOException {
        try {
            log.debug("init started");

            List<JsonWebKey> localJWKs;

            try {
                localJWKs = httpsJwks.getJsonWebKeys();
            } catch (JoseException e) {
                throw new IOException("Could not refresh JWKS", e);
            }

            try {
                refreshLock.writeLock().lock();
                jsonWebKeys = Collections.unmodifiableList(localJWKs);
            } finally {
                refreshLock.writeLock().unlock();
            }

            // Since we just grabbed the keys (which will have invoked a HttpsJwks.refresh()
            // internally), we can delay our first invocation by refreshMs.
            //
            // Note: we refer to this as a _scheduled_ refresh.
            executorService.scheduleAtFixedRate(this::refresh,
                    refreshMs,
                    refreshMs,
                    TimeUnit.MILLISECONDS);

            log.info("JWKS validation key refresh thread started with a refresh interval of {} ms", refreshMs);
        } finally {
            isInitialized = true;

            log.debug("init completed");
        }
    }
Creates a <code>RefreshingHttpsJwks</code> that will be used by the
{@link RefreshingHttpsJwksVerificationKeyResolver} to resolve new key IDs in JWTs.

@param time                     {@link Time} instance
@param httpsJwks                {@link HttpsJwks} instance from which to retrieve the JWKS
                                based on the OAuth/OIDC standard
@param refreshMs                The number of milliseconds between refresh passes to connect
                                to the OAuth/OIDC JWKS endpoint to retrieve the latest set
@param refreshRetryBackoffMs    Time for delay after initial failed attempt to retrieve JWKS
@param refreshRetryBackoffMaxMs Maximum time to retrieve JWKS
clients/src/main/java/org/apache/kafka/common/security/oauthbearer/internals/secured/RefreshingHttpsJwks.java