Как настроить множественный кеш при весенней загрузке с помощью hazelcast? - PullRequest
0 голосов
/ 27 мая 2019

Я новичок в Hazelcast. Я пытаюсь реализовать кэширование в моем весеннем загрузочном приложении. Я создал класс конфигурации для Hazlecast с двумя конфигами карты (CacheObject и CacheList). У меня есть два метода objectMethod (), который возвращает один объект Object сотрудника и listMethod (), который возвращает список Objects сотрудника.

Я использую аннотацию @cacheable для objectMethod и listMethod. Проблема только в том, что кеш объекта работает, кеш списка не работает. Когда я запускаю программу в режиме отладки, кеш объекта возвращает значение, не входя в метод, но кеш списка всегда выполняет методы и получает значение из базы данных.

Мне не хватает какой-либо конфигурации или чего-то еще?

Я использую загрузочную версию Spring 2.1.3. RELEASE, Hazelcast версии 3.11.1 и Hazelcast-spring версии 3.11.1.

Я попробовал URL-адрес кэша Spring-привода, чтобы увидеть кеш, но я вижу только CacheObject, а не CacheList.

http://localhost:8080/actuator/caches

{"cacheManagers":{"cacheManager":{"caches":{"CacheObject":{"target":"com.hazelcast.map.impl.proxy.MapProxyImpl"}}}}}

класс конфигурации

@Configuration
public class HazelcastCacheConfig {

    @Bean
    public Config cacheConfig() {
        return new Config().setInstanceName("hazelcast-instance")
                .addMapConfig(new MapConfig().setName("CacheObject")
                        .setMaxSizeConfig(new MaxSizeConfig(100, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
                        .setEvictionPolicy(EvictionPolicy.LRU).setTimeToLiveSeconds(86400))
                .addMapConfig(new MapConfig().setName("CacheList")
                        .setMaxSizeConfig(new MaxSizeConfig(100, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
                        .setEvictionPolicy(EvictionPolicy.LRU).setTimeToLiveSeconds(86400));
    }

@ кешируемая аннотация

@Cacheable(value="CacheList")
    public List<Employee> getEmployeeList(String a, String b, String b){
        //Query
        return employeeList;

    }
@Cacheable(value="CacheObject")
    public Employee getEmployeeObject(String a, String b, String v) {

        //Query
         return employeeObject;
    }

класс сотрудников

public class Employee implements Serializable{

   private static final long serialVersionUID = 1L;
   private string a,
   private string b,
   private string c,
   private UUID d,
   private Map<String,String> e;
}

1 Ответ

1 голос
/ 27 мая 2019

Используете ли вы оба кэша одинаково?Cachable не будет работать, если вы не работаете с прокси-объектами (не используйте внедрение зависимостей).

Кроме того, как вы настроили свои менеджеры кэша?

package test;

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Repository;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.spring.cache.HazelcastCacheManager;
import com.hazelcast.test.TestHazelcastInstanceFactory;

@RunWith(SpringRunner.class)
@ContextConfiguration(
    classes= { CacheableTest.CacheConfig.class, CacheableTest.Repo.class }
    )
@EnableCaching
public class CacheableTest
{
  @Configuration
  public static class CacheConfig
  {
    @Bean
    public HazelcastInstance hzInstance() {
      return Hazelcast.newHazelcastInstance();
    }

    @Bean
    public CacheManager cacheManager(HazelcastInstance hzInstance) {
        return new HazelcastCacheManager(hzInstance);
    }
  }

  @Repository
  public static class Repo {

    public static int callCountA;
    public static int callCountB;

    @Cacheable("a")
    public String getA(String key) {
      ++callCountA;
      return key;
    }

    @Cacheable("b")
    public String getB(String key) {
      ++callCountB;
      return key;
    }

  }

  @Autowired
  public Repo repo;

  @Test
  public void test() {

    String key = "a";

    assertEquals(0, Repo.callCountA);
    System.out.println(repo.getA(key));
    System.out.println(repo.getA(key));
    assertEquals(1, Repo.callCountA);

    assertEquals(0, Repo.callCountB);
    System.out.println(repo.getB(key));
    System.out.println(repo.getB(key));
    assertEquals(1, Repo.callCountB);

  }
}
...