Стратегия активации по умолчанию для функции Togglz
Начиная с версии 2.0.0, Togglz предлагает стратегии активации, включающие функцию. Например, вы можете подключить список IP-адресов серверов, у которых должна быть включена эта функция. Однако как эти стратегии на самом деле привязаны к функции? Все, что я видел, было то, что я могу изменить стратегию в консоли Togglz или даже редактировать данные вручную в базе данных.
То, что я искал, это механизм по умолчанию, довольно похожий на @EnabledByDefault
, Я мог бы реализовать собственный репозиторий состояний, он мог бы даже искать аннотации, но я подозревал, что это решение существует из коробки.
1 ответ
Просто чтобы поделиться своим собственным решением.
Аннотация для значений по умолчанию
Я определил аннотации, которые следует использовать так, как @EnabledByDefault
является. Вот один из них для стратегии server-ip:
/**
* Allows to specify that the annotated feature should use
* {@link ServerIPStrategy} if the repository doesn't have any
* state saved.
*
* @author Michael Piefel
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface UsingServerIPStrategy {
/**
* A comma-separated list of server IPs for which
* the feature should be active.
*/
String value();
}
Использование аннотации
В определении функции используйте аннотацию так:
…
@EnabledByDefault
@UsingServerIPStrategy(value = "192.168.1.211")
@Label("Run regular jobs to send status e-mails to participants")
MAIL_CRON_JOBS;
…
Государственный репозиторий для оценки
Я хочу взять состояние объекта из хранилища, если оно уже было сохранено. Если нет, аннотации должны быть оценены. Для этого необходим репозиторий делегирования:
/**
* A Togglz {@link StateRepository} that looks for default strategies
* on the defined features.
*
* @author Michael Piefel
*/
@AllArgsConstructor
public class DefaultingStateRepository implements StateRepository {
private StateRepository delegate;
@Override
public FeatureState getFeatureState(Feature feature) {
FeatureState featureState = delegate.getFeatureState(feature);
if (featureState == null) {
// Look for a default strategy.
// If none is defined, a null return value is good enough.
UsingServerIPStrategy serverIPStrategy = FeatureAnnotations
.getAnnotation(feature, UsingServerIPStrategy.class);
if (serverIPStrategy != null) {
featureState = new FeatureState(feature,
FeatureAnnotations.isEnabledByDefault(feature));
featureState.setStrategyId(ServerIpActivationStrategy.ID);
featureState.setParameter(ServerIpActivationStrategy.PARAM_IPS,
serverIPStrategy.value());
}
}
return featureState;
}
@Override
public void setFeatureState(FeatureState featureState) {
// write through
delegate.setFeatureState(featureState);
}
}
Проводка это в
Наконец, чтобы использовать репозиторий, я подключил его в нашем TogglzConfig
компонент, откладывающий до JDBC, но позволяющий также кэшировать его:
…
@Override
public StateRepository getStateRepository() {
JDBCStateRepository jdbcStateRepository = new JDBCStateRepository(dataSource);
DefaultingStateRepository defaultingStateRepository = new
DefaultingStateRepository(jdbcStateRepository);
return new CachingStateRepository(defaultingStateRepository, 60_000);
}
…
@DefaultActivationStrategy можно добавить, чтобы установить стратегию активации по умолчанию. Также вы можете установить для стратегии значения по умолчанию. Пример:
@EnabledByDefault
@Label("UserNotification")
@DefaultActivationStrategy(
id = UserNotificationActivationStrategy.ID,
parameters = {
@ActivationParameter(name = UserNotificationActivationStrategy.LICENSE_TYPE, value ="PRO")
}
);
UserNotificationActivationStrategy - это стратегия активации, определяемая пользователем.
см.: https://github.com/eugenp/tutorials/blob/master/spring-boot/src/main/java/com/baeldung/toggle/MyFeatures.javahttps://www.togglz.org/apidocs/2.3.0.final/org/togglz/core/annotation/defaultactivationstrategy