2017-08-28 1 views
0

J'utilise EHCache pour ma demande de printemps et je ne pense pas que son travail comme prévuEHCache 3 ne fonctionne pas comme une carte

Si vous voyez ci-dessous, je suis d'ajouter les mêmes données à un hashmap et aussi Ehcache .. mais quand j'ai essayé de l'obtenir de l'ehCache il imprime null

Y at-il quelque chose de mal dans la façon dont j'ai initialisé le cache ou quelque chose que j'ai manqué.

Ma classe

@Named 
public class Myclass extends DataLoader { 
private static final Logger LOGGER = Logger.getLogger(Myclass.class.getName()); 
@Inject 
private DictionaryInitializer dictionaryLoader; 

@Inject 
@Named("fileLoader") 
private FileLoader fileLoader; 

private Cache<String,Object> dictionary; 

@PostConstruct 
@Override 
public void loadResource() { 
    List<String> spellTerms = null; 
    dictionary=dictionaryLoader.getCache(); 
    String fileName = "C:\\spelling.txt"; 
    spellTerms = fileLoader.loadResource(fileName);  
    HashMap<String,Object> dictData = new HashMap<>(); 
    for(String line:spellTerms) 
    {   
     for (String key : parseWords(line)) 
     { 
      HashMap<String,Object> tempMap = dictionaryUtil.indexWord(key); 

      if(tempMap!=null && !tempMap.isEmpty()) 
      { 
      Set<Map.Entry<String, Object>> entries = tempMap.entrySet(); 
      for(Map.Entry<String, Object> entry:entries) 
      { 
       dictionary.put(entry.getKey(), entry.getValue()); 
      } 
      } 
      dictData.putAll(tempMap); 

     } 
    } 
    System.out.println(dictData.get("urcle")); //prints 45670 
    System.out.println(dictionary.get("urcle")); // prints null 


}  

private static Iterable<String> parseWords(String text) 
{ 
    List<String> allMatches = new ArrayList<String>(); 
    Matcher m = Pattern.compile("[\\w-[\\d_]]+").matcher(text.toLowerCase()); 
    while (m.find()) { 
     allMatches.add(m.group()); 
    } 
    return allMatches; 
} 

} 

Mon DictionaryInitializer est comme ci-dessous

public class DictionaryInitializer { 
private static final Logger LOGGER = Logger.getLogger(DictionaryInitializer.class.getName()); 
private Cache<String,Object> dictionary; 
@PostConstruct 
public void initializeCache() { 
    CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()  

      .build(true); 
    this.dictionary = cacheManager.createCache("myCache", 
      CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Object.class, 
        ResourcePoolsBuilder.heap(100)).build()); 
    LOGGER.info("Dictionary loaded"); 
} 
public Cache<String,Object> getCache(){ 
    return dictionary; 
} 
public void setCache(Cache<String,Object> dictionary) { 
    this.dictionary=dictionary; 
} 
} 

Répondre

0

J'ai trouvé la question.

J'ai initialisé le cache avec un tas de seulement 100 entrées et donc il ne prend que les 100 premières entrées dans le cache.

Correction de cela et cela fonctionne comme prévu

+0

héhé! soyez prudent avec la taille du cache! –

+0

Attention. Un cache n'est pas une carte. Si vous lisez des données qui devraient rester en mémoire pour toujours, ce n'est pas un cache que vous voulez. Un cache peut expulser et renvoyer une valeur nulle lorsqu'il en a envie (même si l'implémentation réelle ne le fera pas en général). Donc si vous voulez juste garder des données sur tas, vous voulez une carte. – Henri