Уведомление об изменении состояния функции Togglz

У меня есть два приложения - 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);
    }

}

Это DashboardFeatureToggleConfiguration (для веб-консоли Togglz) из моего проекта dashboard:

@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;
    }

}

person alexanoid    schedule 13.03.2016    source источник
comment
Не могли бы вы включить полную конфигурацию Togglz?   -  person chkal    schedule 14.03.2016
comment
@chkal я добавил свою конфигурацию   -  person alexanoid    schedule 14.03.2016


Ответы (1)


Вы используете CachingStateRepository, который вызывает проблему, которую вы описываете. У вас есть в основном два варианта:

Сначала вы можете удалить CachingStateRepository и использовать JDBCStateRepository напрямую. Таким образом, у вас будет гораздо больше обращений к базе данных, но это может быть приемлемо. Таким образом, ваша конфигурация будет выглядеть так:

.stateRepository(new JDBCStateRepository(dataSource))

Вы можете указать значение TTL для CachingStateRepository, что означает, что кэшированные записи будут кэшироваться только в течение определенного времени:

.stateRepository(
   new CachingStateRepository(new JDBCStateRepository(dataSource), 10000)
)

В этом примере для TTL установлено значение 10000, что означает, что состояние функции будет кэшироваться только в течение 10 секунд.

person chkal    schedule 14.03.2016