Togglz 功能状态更改通知

Togglz feature state change notification

我有两个应用程序 - apidashboard。这两个应用程序都使用来自同一数据库的相同功能。 Togglz 控制台仅在 dashboard 应用程序中处于活动状态。问题是,当我更改 dashboard 应用程序中的功能状态时,api 应用程序不会立即意识到这一点。我需要重新启动 api 以刷新功能状态。

是否可以在不重新启动的情况下通知 api 应用程序有关功能状态的更改?

已更新 - 添加了 Togglz 配置

这是我的 Maven common 项目中的基本配置(apidashboard 项目依赖于此):

@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 秒。