自版本2.0.0起,Togglz提供激活策略以使用功能。例如,您可以连接应启用该功能的服务器IP地址列表。但是,这些策略如何实际附加到功能上?我所看到的只是我可以在Togglz控制台中更改策略,甚至可以在数据库中手动编辑数据。
我所寻找的是一些与@EnabledByDefault
非常相似的默认机制。我可以实现一个自定义状态存储库,它甚至可以查找注释,但我怀疑这个解决方案是开箱即用的。
答案 0 :(得分:5)
只是分享我自己的解决方案。
我定义了应该按照@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);
}
…
答案 1 :(得分:0)
@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.java https://www.togglz.org/apidocs/2.3.0.final/org/togglz/core/annotation/defaultactivationstrategy