Togglz 功能状态更改通知
Togglz feature state change notification
我有两个应用程序 - api
和 dashboard
。这两个应用程序都使用来自同一数据库的相同功能。 Togglz 控制台仅在 dashboard
应用程序中处于活动状态。问题是,当我更改 dashboard
应用程序中的功能状态时,api
应用程序不会立即意识到这一点。我需要重新启动 api
以刷新功能状态。
是否可以在不重新启动的情况下通知 api
应用程序有关功能状态的更改?
已更新 - 添加了 Togglz 配置
这是我的 Maven common
项目中的基本配置(api
和 dashboard
项目依赖于此):
@Configuration
public class FeatureToggleConfiguration {
@Autowired
private DataSource dataSource;
@Bean
public FeatureManager getFeatureManager() {
// @formatter:off
FeatureManager featureManager = new FeatureManagerBuilder()
.stateRepository(new CachingStateRepository(new JDBCStateRepository(dataSource)))
.featureEnum(ApplicationFeatures.class)
.userProvider(new SpringSecurityUserProvider(Authority.Type.ROLE_ADMIN.getName()))
.build();
// @formatter:on
return featureManager;
}
}
ApplicationFeatures
(也放在common
项目中):
public enum ApplicationFeatures implements Feature {
// @formatter:off
@EnabledByDefault
@Label("Log Events Feature")
LOG_EVENT_FEATURE,
@EnabledByDefault
@Label("Log Ok Sessions Feature")
LOG_OK_SESSIONS_FEATURE,
@EnabledByDefault
@Label("Log HTTP Requests Data Feature")
LOG_HTTP_REQUESTS_DATA_FEATURE;
// @formatter:on
public boolean isActive() {
return FeatureContext.getFeatureManager().isActive(this);
}
}
这是来自我的 dashboard
项目的 DashboardFeatureToggleConfiguration
(用于 Togglz 网络控制台):
@Configuration
public class DashboardFeatureToggleConfiguration {
@Bean
public ServletRegistrationBean getTogglzConsole() {
ServletRegistrationBean servlet = new ServletRegistrationBean();
servlet.setName("TogglzConsole");
servlet.setServlet(new TogglzConsoleServlet());
servlet.setUrlMappings(Collections.singletonList("/togglz/*"));
return servlet;
}
}
您正在使用 CachingStateRepository
,这导致了您所描述的问题。您基本上有两个选择:
首先,您可以删除 CachingStateRepository
并直接使用 JDBCStateRepository
。这样您将对数据库有更多的点击,但这可能是可以接受的。所以你的配置看起来像这样:
.stateRepository(new JDBCStateRepository(dataSource))
我们可以为 CachingStateRepository
指定 TTL 值,这意味着缓存的条目将仅在特定时间缓存:
.stateRepository(
new CachingStateRepository(new JDBCStateRepository(dataSource), 10000)
)
在此示例中,TTL 设置为 10000,这意味着功能状态将仅缓存 10 秒。
我有两个应用程序 - api
和 dashboard
。这两个应用程序都使用来自同一数据库的相同功能。 Togglz 控制台仅在 dashboard
应用程序中处于活动状态。问题是,当我更改 dashboard
应用程序中的功能状态时,api
应用程序不会立即意识到这一点。我需要重新启动 api
以刷新功能状态。
是否可以在不重新启动的情况下通知 api
应用程序有关功能状态的更改?
已更新 - 添加了 Togglz 配置
这是我的 Maven common
项目中的基本配置(api
和 dashboard
项目依赖于此):
@Configuration
public class FeatureToggleConfiguration {
@Autowired
private DataSource dataSource;
@Bean
public FeatureManager getFeatureManager() {
// @formatter:off
FeatureManager featureManager = new FeatureManagerBuilder()
.stateRepository(new CachingStateRepository(new JDBCStateRepository(dataSource)))
.featureEnum(ApplicationFeatures.class)
.userProvider(new SpringSecurityUserProvider(Authority.Type.ROLE_ADMIN.getName()))
.build();
// @formatter:on
return featureManager;
}
}
ApplicationFeatures
(也放在common
项目中):
public enum ApplicationFeatures implements Feature {
// @formatter:off
@EnabledByDefault
@Label("Log Events Feature")
LOG_EVENT_FEATURE,
@EnabledByDefault
@Label("Log Ok Sessions Feature")
LOG_OK_SESSIONS_FEATURE,
@EnabledByDefault
@Label("Log HTTP Requests Data Feature")
LOG_HTTP_REQUESTS_DATA_FEATURE;
// @formatter:on
public boolean isActive() {
return FeatureContext.getFeatureManager().isActive(this);
}
}
这是来自我的 dashboard
项目的 DashboardFeatureToggleConfiguration
(用于 Togglz 网络控制台):
@Configuration
public class DashboardFeatureToggleConfiguration {
@Bean
public ServletRegistrationBean getTogglzConsole() {
ServletRegistrationBean servlet = new ServletRegistrationBean();
servlet.setName("TogglzConsole");
servlet.setServlet(new TogglzConsoleServlet());
servlet.setUrlMappings(Collections.singletonList("/togglz/*"));
return servlet;
}
}
您正在使用 CachingStateRepository
,这导致了您所描述的问题。您基本上有两个选择:
首先,您可以删除 CachingStateRepository
并直接使用 JDBCStateRepository
。这样您将对数据库有更多的点击,但这可能是可以接受的。所以你的配置看起来像这样:
.stateRepository(new JDBCStateRepository(dataSource))
我们可以为 CachingStateRepository
指定 TTL 值,这意味着缓存的条目将仅在特定时间缓存:
.stateRepository(
new CachingStateRepository(new JDBCStateRepository(dataSource), 10000)
)
在此示例中,TTL 设置为 10000,这意味着功能状态将仅缓存 10 秒。