gpt4 book ai didi

togglz - Togglz 功能的默认激活策略

转载 作者:行者123 更新时间:2023-12-01 11:42:27 26 4
gpt4 key购买 nike

从 2.0.0 版开始,Togglz 提供激活策略来配合功能。例如,您可以连接应启用该功能的服务器 IP 地址列表。然而,这些策略实际上是如何附加到一个特征上的呢?我所看到的只是我可以在 Togglz 控制台中更改策略,甚至可以在数据库中手动编辑数据。

我正在寻找的是一些与 @EnabledByDefault 非常相似的默认机制。我可以实现自定义状态存储库,它甚至可以查找注释,但我怀疑这个解决方案是开箱即用的。

最佳答案

只是为了分享我自己的解决方案。

默认值注释

我定义了应该像 @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;

要评估的状态存储库

如果功能状态已经保存,我想从存储库中获取它。如果不是,则必须评估注释。为此,需要一个委托(delegate)存储库:

/**
* 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);
}

关于togglz - Togglz 功能的默认激活策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com