весенняя загрузка конфигурации Hazelcast для интеграционных тестов - PullRequest
0 голосов
/ 21 сентября 2018

Мы используем JCache и предоставляем backend / CacheManager для спецификации JCache, используя следующую конфигурацию кэша.Hazelcast автоматически конфигурируется весной, и поэтому нам не нужно явно указывать CacheManager, а нужно только указать нашу конфигурацию Hazelcast.

@Configuration
public class CacheConfig {
    public static final int TTL_INFINITE = 0;

    @Bean
    public Config hazelCastConfig() {
        // do not allow hazelcast to send data to hazelcast, see
        // http://docs.hazelcast.org/docs/latest-development/manual/html/Preface/Phone_Home.html
        GroupProperty.PHONE_HOME_ENABLED.setSystemProperty("false");
        return new Config()
                .setInstanceName("hazelcast-instance")
                // create a cache
                .addCacheConfig(new CacheSimpleConfig()
                        .setName(RateLimiterServiceImpl.CACHE_NAME))
                // store it distributed
                .addMapConfig(new MapConfig()
                        .setName(RateLimiterServiceImpl.CACHE_NAME)
                        .setTimeToLiveSeconds(RateLimiterServiceImpl.CACHE_SECONDS_TO_LIVE)
                        .setEvictionPolicy(EvictionPolicy.LFU))
                // create a cache
                .addCacheConfig(new CacheSimpleConfig()
                        .setName(I18nServiceImpl.CACHE_NAME))
                // store it distributed
                .addMapConfig(new MapConfig()
                        .setName(I18nServiceImpl.CACHE_NAME)
                        .setTimeToLiveSeconds(I18nServiceImpl.CACHE_SECONDS_TO_LIVE)
                        .setEvictionPolicy(EvictionPolicy.LRU));
    }

}

На производстве и при локальном запуске тестов все в порядке.Но, используя gitlab CI, мы получаем следующую ошибку во время интеграционных тестов:

java.lang.IllegalStateException: null
        at com.hazelcast.cache.impl.AbstractHazelcastCacheManager.checkIfManagerNotClosed(AbstractHazelcastCacheManager.java:374) ~[hazelcast-3.9.2.jar:3.9.2]

и с hazelcast 3.10.5

java.lang.IllegalStateException: CacheManager /hz/ is already closed.
    at com.hazelcast.cache.impl.AbstractHazelcastCacheManager.ensureOpen(AbstractHazelcastCacheManager.java:366) ~[hazelcast-3.10.5.jar:3.10.5]
    at com.hazelcast.cache.impl.AbstractHazelcastCacheManager.getCache(AbstractHazelcastCacheManager.java:219) ~[hazelcast-3.10.5.jar:3.10.5]
    at com.hazelcast.cache.impl.AbstractHazelcastCacheManager.getCache(AbstractHazelcastCacheManager.java:67) ~[hazelcast-3.10.5.jar:3.10.5]
    at org.springframework.cache.jcache.JCacheCacheManager.getMissingCache(JCacheCacheManager.java:114) ~[spring-context-support-4.3.8.RELEASE.jar:4.3.8.RELEASE]
    at org.springframework.cache.support.AbstractCacheManager.getCache(AbstractCacheManager.java:97) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]

Этот тест не пройден:

mockMvc.perform(put("/translations/{locale}", locale)
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .content(dto)
                    .andExpect(status().isNoContent());
// gives a 500 with the above error message

Как настроить интеграционные тесты для работы с hazelcast?

1 Ответ

0 голосов
/ 26 сентября 2018

CacheManager is and iterface, при использовании CacheManager с hazelcast он использует HazelcastCacheManagerImpl.

Когда соединение с hazelcast по какой-либо причине сбрасывается или теряется, исключение, hazelcast завершается и т. Д. Внутреннее соединение hazelcast используется HazelcastCacheManagerстановится закрытым, и как только весь CacheManager становится закрытым, попытка получить определенный Cache из такого менеджера кэша и выполнить операцию r / w в таком кэше приведет к «java.lang.IllegalStateException: CacheManager / hz / уже закрыт».исключение.

Когда Hazelcast возвращается к жизни (повторно подключен или еще), вам необходимо вручную повторно подключить CacheManager к Hazelcast.Я поиграл с 3.5.7 версией hazelcast и для решения этой проблемы мы создали CacheManager в качестве прокси-компонента.

В случае, если мы обнаружим, что CacheManager потерял соединение с реальной частотой, мы начинаем попытки вручную переподключить CacheManager и вв случае успеха замените ссылки на CacheManager новыми.

Это вопрос о том, как повторно запускать пружинные бины во время выполнения.

Я предполагаю, что в вашем тесте у вас похожая ситуация во время тестового соединенияхз теряется, кеш закрывается.Даже если вы перезапустите hazelcast, но не переинициализируете компонент CacheManager - он может указывать на старое закрытое соединение hz и не будет переподключаться автоматически.

Если вы используете механизм @SpringBootTest, использование аннотации @ DirtiesContext можетпомогите, чтобы каждый тест заново инициировал весь контекст весны, поэтому, если в предыдущем тесте вы уничтожили соединение Hazelcast, перезапустите hz или что-то еще, в следующем тесте DirtiesContext вызовет повторную инициализацию CacheManger и поможет получить результаты тестов с повторяемостью.

...