2017-12-30 20 views
0
@Cacheable(value = "apis", key = "#request") 
    public Object queryCenterAPI(QCRequest request,HttpHeaders headers) throws JSONException, ParseException { 

     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.setErrorHandler(new ToolsResponseHandler()); 
     Response res=new Response(); 
     HashMap<String,String> map=new HashMap<String,String>(); 
     logger.info("No Caching^^^^^^^^^^"); 
     Gson gson = new Gson(); 
     String requestJson = gson.toJson(request); 
     HttpEntity<String> requestEntity = new HttpEntity<String>(requestJson, headers); 
     System.out.println("Request Body "+requestEntity); 

     Object response = null; 
     try { 
      response = restTemplate.postForObject(QCUtils.queryURL, requestEntity, Object.class); 
      logger.info("1st response>"+response); 

      response = response.toString().replaceAll("\\\\", ""); 
      System.out.println("Final response "+response); 

     }catch (HttpClientErrorException httpEx) { 

      logger.info("Error:"+httpEx); 
     } 
     return response; 

    } 

    @CacheEvict(value = "apis", key = "#request") 
     public void resetOnRequest(QCRequest request) { 
     // Intentionally blank 
     System.out.println("Evict in Progrsss......"); 

     } 

キャッシングは正常ですが、@CacheEvictアノテーションを使用することができません。CacheEvictメソッドはCacheableメソッドの直後に呼び出されます。 resetOnRequest()メソッドは、Cachableメソッド(queryCenterAPI)の後には呼び出されません。@CacheEvictがSpringBootで動作しない

答えて

0

ehcacheを使用すると、以下のXmlファイルとConfigファイルを追加して、キャッシュとエビクトをキャッシュするだけで十分です。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="ehcache.xsd" 
    updateCheck="true" 
    monitoring="autodetect" 
    dynamicConfig="true"> 

    <diskStore path="java.io.tmpdir" /> 

    <cache name="apis" 
     eternal="false" 
     maxEntriesLocalHeap="10000" 
     maxEntriesLocalDisk="1000" 
     diskSpoolBufferSizeMB="20" 
     timeToIdleSeconds="200" timeToLiveSeconds="900" 
     memoryStoreEvictionPolicy="LFU" 
     transactionalMode="off"> 
    </cache> 

public class AppConfig { 

    @Bean 
    public CacheManager cacheManager() { 
     return new EhCacheCacheManager(ehCacheCacheManager().getObject()); 
    } 

    @Bean 
    public EhCacheManagerFactoryBean ehCacheCacheManager() { 
     EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean(); 
     cmfb.setConfigLocation(new ClassPathResource("ehcache.xml")); 
     cmfb.setShared(true); 
     return cmfb; 
    } 
} 

xmlファイルで設定するだけで、キャッシュの削除が行われるまでの時間が必要です。

0

@CacheEvictを正常に動作させるには、「aspectj」モードに切り替える必要があると思います。春documentationから

キャッシュ注釈を処理するためのデフォルトのアドバイスモードのみプロキシ経由の通話の傍受を可能にし、「プロキシ」 です。ローカルの 同じクラス内の呼び出しは、そのように傍受されることはありません。 より高度なインターセプトモードの場合は、コンパイル時またはロード時の織りと組み合わせて、 "aspectj" モードに切り替えることを検討してください。

第2のオプションは、@CacheEvictメソッドを別のクラスに移動しようとすることです。

関連する問題