Package net.shibboleth.shared.service

# Class AbstractReloadableService<T>

java.lang.Object
net.shibboleth.shared.component.AbstractInitializableComponent
net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent
net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent
net.shibboleth.shared.service.AbstractReloadableService<T>

Type Parameters:
  `T` - The sort of service this implements.

All Implemented Interfaces:
  `Component`, `DestructableComponent`, `IdentifiableComponent`, `IdentifiedComponent`, `InitializableComponent`, `UnmodifiableComponent`, `ReloadableService<T>`

Direct Known Subclasses:
  `LogbackLoggingService`, `MockReloadableService`, `ReloadableSpringService`

public abstract class AbstractReloadableService<T> extends AbstractIdentifiableInitializableComponent implements ReloadableService<T>, UnmodifiableComponent
Base class for `ReloadableService`. This base class will use a background thread that will perform a periodic check, via `shouldReload()`, and, if required, invoke the service's `reload()` method.

This class does not deal with any synchronization; that is left to implementing classes.

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`protected class`
`AbstractReloadableService.ServiceReloadTask`
A watcher that determines if a service should be reloaded and does so as appropriate.

## Field Summary

Fields
Modifier and Type
Field
Description
`private boolean`
`failFast`
Do we fail immediately if the config is bogus?
`private Timer`
`internalTaskTimer`
Timer used to schedule reload tasks if no external one set.
`private Instant`
`lastReloadInstant`
The last time the service was reloaded, whether successful or not.
`private Instant`
`lastSuccessfulReleaseInstant`
The last time the service was reloaded successfully.
`private final org.slf4j.Logger`
`log`
Class logger.
`private String`
`logPrefix`
The log prefix.
`private Duration`
`reloadCheckDelay`
Time between one reload check and another.
`private Throwable`
`reloadFailureCause`
The cause of the last reload failure, if the last reload failed.
`private AbstractReloadableService<T>.ServiceReloadTask`
`reloadTask`
Watcher that monitors the set of configuration resources for this service for changes.
`private Timer`
`reloadTaskTimer`
Timer used to schedule configuration reload tasks.

## Constructor Summary

Constructors
Constructor
Description
`AbstractReloadableService()`
Constructor.

## Method Summary

Modifier and Type
Method
Description
`protected void`
`doDestroy()`
Performs component specific destruction logic.
`protected void`
`doInitialize()`
This method checks to ensure that the component ID is not null.
`protected void`
`doReload()`
Performs the actual reload.
`Instant`
`getLastReloadAttemptInstant()`
Gets the time when the service last attempted to reload.
`Instant`
`getLastSuccessfulReloadInstant()`
Gets the time when the service was last successfully reloaded.
`protected String`
`getLogPrefix()`
Return a string which is to be prepended to all log messages.
`Duration`
`getReloadCheckDelay()`
Gets the time between one reload check and another.
`Throwable`
`getReloadFailureCause()`
Gets the reason the last reload failed.
`Timer`
`getReloadTaskTimer()`
Gets the timer used to schedule configuration reload tasks.
`boolean`
`isFailFast()`
Do we fail fast?
`final void`
`reload()`
Reloads the configuration of the service.
`void`
`setFailFast(boolean value)`
Sets whether we fail fast.
`void`
`setReloadCheckDelay(Duration delay)`
Sets the time between one reload check and another.
`void`
`setReloadTaskTimer(Timer timer)`
Sets the timer used to schedule configuration reload tasks.
`protected abstract boolean`
`shouldReload()`
Called by the `AbstractReloadableService<T>.ServiceReloadTask` to determine if the service should be reloaded.

### Methods inherited from class net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent

`setId`

### Methods inherited from class net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent

`ensureId, getId, ifDestroyedThrowDestroyedComponentException, ifInitializedThrowUnmodifiabledComponentException, ifNotInitializedThrowUninitializedComponentException`

### Methods inherited from class net.shibboleth.shared.component.AbstractInitializableComponent

`checkComponentActive, checkSetterPreconditions, destroy, initialize, isDestroyed, isInitialized`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface net.shibboleth.shared.component.IdentifiedComponent

`getId`

### Methods inherited from interface net.shibboleth.shared.component.InitializableComponent

`initialize, isInitialized`

### Methods inherited from interface net.shibboleth.shared.service.ReloadableService

`getServiceableComponent`

## Field Details

### log

@Nonnull private final org.slf4j.Logger log
Class logger.

### reloadCheckDelay

@Nonnull private Duration reloadCheckDelay
Time between one reload check and another.

### reloadTaskTimer

@Nullable private Timer reloadTaskTimer
Timer used to schedule configuration reload tasks.

### internalTaskTimer

@Nullable private Timer internalTaskTimer
Timer used to schedule reload tasks if no external one set.

### reloadTask

@Nullable private AbstractReloadableService<T>.ServiceReloadTask reloadTask
Watcher that monitors the set of configuration resources for this service for changes.

### lastReloadInstant

@Nullable private Instant lastReloadInstant
The last time the service was reloaded, whether successful or not.

### lastSuccessfulReleaseInstant

@Nullable private Instant lastSuccessfulReleaseInstant
The last time the service was reloaded successfully.

### reloadFailureCause

@Nullable private Throwable reloadFailureCause
The cause of the last reload failure, if the last reload failed.

### failFast

private boolean failFast
Do we fail immediately if the config is bogus?

### logPrefix

@Nullable private String logPrefix
The log prefix.

## Constructor Details

### AbstractReloadableService

public AbstractReloadableService()
Constructor.

## Method Details

### getReloadCheckDelay

@Nonnull public Duration getReloadCheckDelay()
Gets the time between one reload check and another. A value of 0 or less indicates that no reloading will be performed.

Default value: 0

Returns:
  time between one reload check and another

### setReloadCheckDelay

public void setReloadCheckDelay(@Nonnull Duration delay)
Sets the time between one reload check and another. A value of 0 or less indicates that no reloading will be performed.

This setting cannot be changed after the service has been initialized.

Parameters:
  `delay` - between one reload check and another

### getReloadTaskTimer

@Nullable public Timer getReloadTaskTimer()
Gets the timer used to schedule configuration reload tasks.

Returns:
  timer used to schedule configuration reload tasks

### setReloadTaskTimer

public void setReloadTaskTimer(@Nullable Timer timer)
Sets the timer used to schedule configuration reload tasks. This setting can not be changed after the service has been initialized.

Parameters:
  `timer` - timer used to schedule configuration reload tasks

### getLastReloadAttemptInstant

@Nullable public Instant getLastReloadAttemptInstant()
Gets the time when the service last attempted to reload. If the reload was successful this time should match the time given by `ReloadableService.getLastSuccessfulReloadInstant()`.

Specified by:
  `getLastReloadAttemptInstant` in interface `ReloadableService<T>`
Returns:
  time when the service last attempted to reload

### getLastSuccessfulReloadInstant

@Nullable public Instant getLastSuccessfulReloadInstant()
Gets the time when the service was last successfully reloaded. Returns null if the service has never reloaded.

Specified by:
  `getLastSuccessfulReloadInstant` in interface `ReloadableService<T>`
Returns:
  time when the service was last successfully reloaded

### getReloadFailureCause

@Nullable public Throwable getReloadFailureCause()
Gets the reason the last reload failed.

Specified by:
  `getReloadFailureCause` in interface `ReloadableService<T>`
Returns:
  reason the last reload failed or null if the last reload was successful

### isFailFast

public boolean isFailFast()
Do we fail fast?

Returns:
  whether we fail fast.

### setFailFast

public void setFailFast(boolean value)
Sets whether we fail fast.

Parameters:
  `value` - what to set.

### doInitialize

protected void doInitialize() throws ComponentInitializationException
This method checks to ensure that the component ID is not null. Performs the initialization of the component. This method is executed within the lock on the object being initialized. The default implementation of this method is a no-op.

Overrides:
  `doInitialize` in class `AbstractIdentifiedInitializableComponent`
Throws:
  `ComponentInitializationException` - thrown if there is a problem initializing the component

### doDestroy

protected void doDestroy()
Performs component specific destruction logic. This method is executed within the lock on the object being destroyed. The default implementation of this method is a no-op.

Overrides:
  `doDestroy` in class `AbstractInitializableComponent`

### reload

public final void reload()
Reloads the configuration of the service. Whether internal state is maintained between reloads is implementation dependent.

Specified by:
  `reload` in interface `ReloadableService<T>`

### shouldReload

protected abstract boolean shouldReload()
Called by the `AbstractReloadableService<T>.ServiceReloadTask` to determine if the service should be reloaded.

No lock is held when this method is called, so any locking needed should be handled internally.

Returns:
  true iff the service should be reloaded

### doReload

protected void doReload()
Performs the actual reload.

No lock is held when this method is called, so any locking needed should be handled internally.

Throws:
  `ServiceException` - thrown if there is a problem reloading the service

### getLogPrefix

@Nonnull @NotEmpty protected String getLogPrefix()
Return a string which is to be prepended to all log messages.

Returns:
  "Service '<definitionID>' :"