我是 Java 和 SpringBoot 新手。
resources
中的ehcache.xml文件:
<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">
<cache alias="configCache">
<key-type>java.lang.Integer</key-type>
<value-type>java.lang.Integer</value-type>
<expiry>
<ttl unit="minutes">60</ttl>
</expiry>
<listeners>
<listener>
<class>com.demo.example.ehcache.CacheEventLogger</class>
<event-firing-mode>ASYNCHRONOUS</event-firing-mode>
<event-ordering-mode>UNORDERED</event-ordering-mode>
<events-to-fire-on>CREATED</events-to-fire-on>
<events-to-fire-on>EXPIRED</events-to-fire-on>
</listener>
</listeners>
<resources>
<heap unit="entries">2</heap>
<offheap unit="MB">10</offheap>
</resources>
</cache>
</config>
application.properties
中的以下行:
spring.cache.jcache.config=classpath:ehcache.xml
缓存事件记录器:
package com.demo.example.ehcache;
import com.github.structlog4j.ILogger;
import com.github.structlog4j.SLoggerFactory;
import org.ehcache.event.CacheEvent;
import org.ehcache.event.CacheEventListener;
public class CacheEventLogger implements CacheEventListener<Object, Object> {
private final ILogger log = SLoggerFactory.getLogger(CacheEventLogger.class);
@Override
public void onEvent(CacheEvent<? extends Object, ? extends Object> cacheEvent) {
log.info("Cache event {} for item with key {}. Old value = {}, New value = {}",
cacheEvent.getType(),
cacheEvent.getKey(),
cacheEvent.getOldValue(),
cacheEvent.getNewValue());
}
}
ConfigManager.Java:
package com.demo.example.ehcache;
import org.springframework.cache.annotation.Cacheable;
public class ConfigManager {
public ConfigManager() {
}
@Cacheable(value = "configCache", key="#number")
public int getNumber(int number) {
return number;
}
}
CachingConfig.java:
package com.demo.example.configuration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CachingConfig {
}
pom.xml 中的以下依赖项:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
ServiceFacadeImpl.java:
@Component
public class ServiceFacadeImpl {
private final ConfigManager ConfigManager;
ServiceFacadeImpl()
{
this.ConfigManager = new ConfigManager();
}
@Override
public Integer getNumber() throws UpfrontException {
configManager.getNumber(1); //hard coded 1 here
}
}
我总是在 getNumber 中传递固定的整数值 1,但它总是执行该函数。为什么缓存不起作用?
您似乎遇到了 Ehcache 3 无法与 Spring Boot 1.5.22 配合使用的问题。以下是 Stack Overflow1 上发布的类似问题的一些详细信息:
用户在资源中有一个 ehcache.xml 文件,其缓存别名为“configCache”,监听器类为 com.demo.example.ehcache.CacheEventLogger。 application.properties 文件具有 spring.cache.jcache.config=classpath:ehcache.xml 行。 CacheEventLogger 类实现了 CacheEventListener
确保您的 ehcache.xml 已正确配置并位于正确的位置。 确保您的 CacheEventLogger 和 ConfigManager 类已正确实现。 检查您的 pom.xml 是否具有正确的依赖项和版本。 验证您的 application.properties 文件是否具有正确的配置。