Участники Hazelcast не используют общие записи во встроенной топологии

#java #spring-boot #caching #hazelcast

#java #весенняя загрузка #кэширование #hazelcast

Вопрос:

У меня есть небольшое загрузочное приложение spring, и я использую Hazelcast (топология встроенного кэша) для кэширования. Это класс @Configuration для Hazelcast:

 @Configuration
@EnableCaching
public class HazelcastConfig {
public static final String BANKS = "banks";

@Bean
Config config() {
    Config config = new Config();

    MapConfig mapConfig = new MapConfig();
    mapConfig.setTimeToLiveSeconds(3000);
    config.getMapConfigs().put(BANKS, mapConfig);

    return config;
}
  

}

Затем я добавляю аннотацию @Cachable к одному из моих методов:

 @Cacheable(HazelcastConfig.BANKS)
public UserAccount findByAccountNumber(String accountNumber){
    logger.info("INSIDE REPO");
    UserAccount userAccount = new UserAccount();
    userAccount.setAccountNumber(accountNumber);
    userAccount.setId(new Long(1));
    userAccount.setAddress("via Rossi");
    userAccount.setName("Pippo");

    return userAccount;
}
  

Кажется, все работает нормально: при первом вызове метода программа вводит внутри тела самого метода; со второго раза программа получает значение из кэша (программа не вводит внутри тела метода).
Проблемы начинаются, когда я запускаю 2 экземпляра приложения; когда я запускаю второй экземпляр, я вижу, что Hazelcast понимает, что есть 2 участника (из журналов):

 Members {size:2, ver:2} [
Member [172.15.245.39]:5701 - cec4e04a-a8ef-4bd1-9072-5c313ba14666
Member [172.15.245.39]:5702 - bfe7d9a0-dcfd-4a9e-8a10-3e3882e814d2 this
]
  

но у этих 2 членов, похоже, есть 2 отдельных кэша; это мой тест:

  1. Запустите экземпляр 1 приложения (порт tomcat 8080)
  2. Запустите экземпляр 2 приложения (порт tomcat 8090)
  3. Вызов метода из экземпляра 1-> программа не использует кеш (хорошо, потому что кеш пуст)
  4. Вызовите метод из экземпляра 1 -> программа использует кэш (хорошо, потому что теперь в кэше есть запись)
  5. Вызовите метод из экземпляра 2-> программа не использует кеш (KO, потому что я думаю, что кеши двух экземпляров должны иметь одинаковые записи).

    Есть предложения?

Комментарии:

1. Попробуйте изменить @Cacheable(HazelcastConfig.BANKS) на @Cacheable(value=HazelcastConfig.BANKS, sync=true) . Это решает проблему?

2. Я пытался, но у меня это не работает, та же проблема.

3. У вас такая же проблема, следуя этому руководству: guides.hazelcast.org/caching-springboot ?

4. Какие версии вы используете? sync=true для меня, на Spring 2.3.4.RELEASE и Hazelcast 4.0.3, если вы можете опубликовать полный пример кода, это должно быть возможно выяснить. Обратите внимание, что настройка sync не обязательно является ответом, скорее объяснением.

5. Вы действительно убедились, что значение хранится в Hazelcast? Похоже, вы только что проверили, вызывается ли метод или нет, но вы не заглядывали внутрь самого Hazelcast. Я предполагаю, что здесь используется другой кеш благодаря автоконфигурации Spring.