EHCACHE 3.x Spring Boot缓存中没有值

我正在尝试使用ehcache。

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
      public JCacheCacheManager jCacheCacheManager() throws IOException {
        return new JCacheCacheManager(cacheManager());
      }

      @Bean(destroyMethod = "close")
      public javax.cache.CacheManager cacheManager() throws IOException {
        XmlConfiguration xmlConfig = new XmlConfiguration(new ClasspathResource("ehcache.xml").getURL());
        EhcacheCachingProvider provider = (EhcacheCachingProvider) Caching.getcachingProvider();
        return provider.getcacheManager(provider.getDefaulturi(),xmlConfig);

      }
    }
@Service
public class AvengersService {


    @Cacheable(cacheNames="avengers",key="#id")
    public List<String> getavengers(String id) {
        System.out.println("Loading avengers");
        return Arrays.asList(id.toString(),"Captain America","Hulk","iron Man","Thor");
    }

}

@SpringBootApplication
@ComponentScan
public class DemoApplication   {

    @Autowired
    private CacheManager cacheManager;

    @Autowired
    private AvengersService avengersService;

    public static void main(String[] args) {


          //list all the caching provider
        Iterator<CachingProvider> iterator = Caching.getcachingProviders(Caching.getDefaultClassLoader()).iterator();
        while(iterator.hasnext()) {
            CachingProvider provider = iterator.next();
            System.out.println(provider);
            if ((provider instanceof HazelcastCachingProvider)) {
                iterator.remove();
            }
        }

        SpringApplication.run(DemoApplication.class,args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {

            JCacheCache cache = (JCacheCache) cacheManager
                    .getcache("avengers");

        for(Long i=1L;i<50001;i++) {
            List<String> t=avengersService.getavengers(String.valueOf(i)+"a");
        cache.put(String.valueOf(i)+"a",avengersService.getavengers(String.valueOf(i)+"a"));
        }
        System.out.println();

        Cache<Object,Object>    e= ( cache.getNativeCache());
        Iterator<Cache.Entry<Object,Object>> iterator = ( e).iterator();
        int count=1;
        while (iterator.hasnext()) {
            Cache.Entry<Object,Object> t = iterator.next();
            count++;
            System.out.println("key :" + t.getKey() + " value " + t.getvalue());
        }


        System.out.println(count);

        final MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();

        final Set<ObjectInstance> cacheBeans = beanServer.queryMBeans(objectname.getInstance("javax.cache:type=CacheStatistics,CacheManager=*,Cache=*"),null);

        for ( ObjectInstance cacheBean : cacheBeans ) {
            final CacheStatisticsMXBean cacheStatisticsMXBean = MBeanServerinvocationHandler.newProxyInstance(beanServer,cacheBean.getobjectname(),CacheStatisticsMXBean.class,false);

            System.out.println("Gets: " + cacheStatisticsMXBean.getcacheGets());
            System.out.println("Hits: " + cacheStatisticsMXBean.getcacheHits());
            System.out.println("Misses: " + cacheStatisticsMXBean.getcacheMisses());
            System.out.println("Removals: " + cacheStatisticsMXBean.getcacheRemovals());
            System.out.println("Evictions: " + cacheStatisticsMXBean.getcacheEvictions());
            System.out.println("Avg Get Time: " + cacheStatisticsMXBean.getaverageGetTime());
            System.out.println("Avg Put Time: " + cacheStatisticsMXBean.getaveragePutTime());
            System.out.println("Avg Remove Time: " + cacheStatisticsMXBean.getaverageRemoveTime());
        }
        };
    }

}
public class MyCacheEntryListener<K,V> implements CacheEventListener<K,V>,Serializable {

    @Override
    public void onEvent(CacheEvent<? extends K,? extends V> event) {
        // TODO Auto-generated method stub

        if (EventType.UPDATED == event.getType()) {
            System.out.println("Received a " + event);
        }
    }

}
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.ehcache.org/v3"
    xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
    xsi:schemaLocation="
            http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
            http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

 <service>
      <jsr107:defaults enable-management="true" enable-statistics="true"/>
  </service>
    <cache alias="avengers">
        <key-type>java.lang.String</key-type>
        <value-type>java.util.Arrays$ArrayList</value-type>
        <expiry>
             <none/>
        </expiry>
 <listeners>
            <listener>
                <class>com.example.demo.MyCacheEntryListener</class>
                <event-firing-mode>ASYNCHRONOUS</event-firing-mode>
                <event-ordering-mode>UNORDERED</event-ordering-mode>
                <events-to-fire-on>UPDATED</events-to-fire-on>
            </listener>
        </listeners>
        <resources>
            <heap unit="entries">2</heap>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>

</config>
spring.cache.jcache.config=classpath:ehcache.xml
  

Blockquote

开始我的应用程序时,其prints 2缓存提供程序。

HazelcastCachingProvider {delegate = HazelcastServerCachingProvider {hazelcastInstance = null}}    org.ehcache.jsr107.EhcacheCachingProvider@1f57539

  1. 为什么要初始化2个缓存提供程序?
  2. 如果是默认设置,如何禁用这些功能?
  3. 我已在缓存中添加了50000个对象,但是在进行迭代时我为什么只得到“ 36406”对象?
h8621007 回答:EHCACHE 3.x Spring Boot缓存中没有值

这里有很多活动部件。您无需配置CacheManager,它是通过spring.cache.jcache.config属性自动完成的。删除2个@Bean方法。

如果您需要访问javax.cache.CacheManager,则可以注入JCacheCacheManager,它将使您可以访问包装的本机文件。

类路径上有几种JSR107实现,因此API调用可以为您提供可用的东西,而Spring Boot无法控制这一切。

本文链接:https://www.f2er.com/2920201.html

大家都在问