0

春に動作するように jcache の ehcache 実装を統合しようとしています。したがって、次のように定義されたファサードがあります。

@Component(value = "sampleFacade")
 @CacheDefaults(cacheName = "default")
 public class SampleFacadeImpl implements SampleFacade
 {

   @Override
   @CacheResult(cacheName = "site")
    public SitePojo getSiteForUid(final String uid)
    {
        System.out.println("getting the site for uid: " + uid);

        final SitePojo pojo = new SitePojo();
        pojo.setUid(uid);
        pojo.setUrl(uid);

        return pojo;
    }
}

そして、次のような Java ベースの構成:

@Configuration
@EnableCaching(mode = AdviceMode.PROXY)
@ComponentScan(basePackages = { "com.test" })
public class TestConfig implements CachingConfigurer
{
   @Resource
   public ApplicationContext context;

   @Override
   @Bean(name = { "defaultKeyGenerator", "keyGenerator" })
   public KeyGenerator keyGenerator() {
       return new SimpleKeyGenerator();
   }

   @Override
   @Bean(name = { "defaultCacheManager", "cacheManager" })
   public CacheManager cacheManager() {
       final JCacheCacheManager cacheManager = new JCacheCacheManager();
       cacheManager.setCacheManager((javax.cache.CacheManager) context.getBean("cacheManagerFactoryBean"));

       return cacheManager;
   }

   @Bean(name = { "defaultCacheManagerFactoryBean", "cacheManagerFactoryBean" })
   protected JCacheManagerFactoryBean defaultCacheManagerFactoryBean() {
       return new JCacheManagerFactoryBean();
   }
}

そして、ファサードを 10 回呼び出すテスト:

@Test
public void testGetSiteForUid() {
    for (int i = 0; i < 10; i++) {
        assertNotNull(sampleFacade.getSiteForUid("uid"));
    }
}

しかし、結果はメソッドを 10 回通過しています。

getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid
getting the site for uid: uid

ここでそれを再現するためのサンプル プロジェクトを見つけることができます: https://github.com/paranoiabla/spring-cache-test

4

1 に答える 1

2

JCache サポートは、Spring 4.1 の新機能です。このサポートがまだない 4.0.4 を使用しています。

Spring Framework 4.1 はまだリリースされていません。プロジェクトに以下を追加することで、スナップショットを試すことができます

<repositories>
  <repository>
    <id>spring-snapshot</id>
    <name>Springframework Snapshot Repository</name>
    <url>http://repo.spring.io/snapshot</url>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
  </repository>
</repositories>

そして、spring.versionに反転4.1.0.BUILD-SNAPSHOT

私はあなたのプロジェクトをフォークし、ここで更新して、正常に機能するようにしました。私が変更したものを確認すると、何が欠けているかを理解するのに役立ちます。

注: JSR-107 キャッシュ マネージャーが間違っています。を作成し、javax.cache.CacheManagerそれを取得したら、それを Spring の にラップする必要がありますCacheManagerそこに何でも 宣言することができCacheManager、それが機能することに注意してください(SimpleCacheManagerGuavaCacheManager、など)。

于 2014-05-12T14:24:35.487 に答える