Class RefreshProtectedCredentialsProvider<T>
- java.lang.Object
-
- com.rabbitmq.client.impl.RefreshProtectedCredentialsProvider<T>
-
- Type Parameters:
T
- the type of token (usually specified by the subclass)
- All Implemented Interfaces:
CredentialsProvider
- Direct Known Subclasses:
OAuth2ClientCredentialsGrantCredentialsProvider
public abstract class RefreshProtectedCredentialsProvider<T> extends java.lang.Object implements CredentialsProvider
An abstractCredentialsProvider
that does not let token refresh happen concurrently.A token is usually long-lived (several minutes or more), can be re-used inside the same application, and refreshing it is a costly operation. This base class lets a first call to
refresh()
pass and block concurrent calls until the first call is over. Concurrent calls are then unblocked and can benefit from the refresh. This avoids unnecessary refresh operations to happen if a token is already being renewed.Subclasses need to provide the actual token retrieval (whether is a first retrieval or a renewal is a implementation detail) and how to extract information (username, password, time before expiration) from the retrieved token.
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.concurrent.atomic.AtomicReference<java.util.concurrent.CountDownLatch>
latch
private static org.slf4j.Logger
LOGGER
private java.util.concurrent.atomic.AtomicBoolean
refreshInProcess
private java.util.concurrent.locks.Lock
refreshLock
private java.util.concurrent.atomic.AtomicReference<T>
token
-
Constructor Summary
Constructors Constructor Description RefreshProtectedCredentialsProvider()
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description java.lang.String
getPassword()
Password/secret/token to use for authenticationjava.time.Duration
getTimeBeforeExpiration()
The time before the credentials expire, if they do expire.java.lang.String
getUsername()
Username to use for authenticationprotected abstract java.lang.String
passwordFromToken(T token)
void
refresh()
Instructs the provider to refresh or renew credentials.protected abstract T
retrieveToken()
protected abstract java.time.Duration
timeBeforeExpiration(T token)
protected abstract java.lang.String
usernameFromToken(T token)
-
-
-
Field Detail
-
LOGGER
private static final org.slf4j.Logger LOGGER
-
token
private final java.util.concurrent.atomic.AtomicReference<T> token
-
refreshLock
private final java.util.concurrent.locks.Lock refreshLock
-
latch
private final java.util.concurrent.atomic.AtomicReference<java.util.concurrent.CountDownLatch> latch
-
refreshInProcess
private java.util.concurrent.atomic.AtomicBoolean refreshInProcess
-
-
Method Detail
-
getUsername
public java.lang.String getUsername()
Description copied from interface:CredentialsProvider
Username to use for authentication- Specified by:
getUsername
in interfaceCredentialsProvider
- Returns:
- username
-
getPassword
public java.lang.String getPassword()
Description copied from interface:CredentialsProvider
Password/secret/token to use for authentication- Specified by:
getPassword
in interfaceCredentialsProvider
- Returns:
- password/secret/token
-
getTimeBeforeExpiration
public java.time.Duration getTimeBeforeExpiration()
Description copied from interface:CredentialsProvider
The time before the credentials expire, if they do expire.If credentials do not expire, must return null. Default behavior is to return null, assuming credentials never expire.
- Specified by:
getTimeBeforeExpiration
in interfaceCredentialsProvider
- Returns:
- time before expiration
-
refresh
public void refresh()
Description copied from interface:CredentialsProvider
Instructs the provider to refresh or renew credentials.Default behavior is no-op.
- Specified by:
refresh
in interfaceCredentialsProvider
-
retrieveToken
protected abstract T retrieveToken()
-
usernameFromToken
protected abstract java.lang.String usernameFromToken(T token)
-
passwordFromToken
protected abstract java.lang.String passwordFromToken(T token)
-
timeBeforeExpiration
protected abstract java.time.Duration timeBeforeExpiration(T token)
-
-