建议的存储数据的方法是什么,让它从Java EE / WebApp容器中自动过期?我可以使用会话持久性机制,但我的http会话通常比我希望保留这些信息的时间长很多。
是否有Java EE 7或CDI提供的内容? JCache规范JSR 107的一些初步变体?还有其他好的解决方案吗?
答案 0 :(得分:3)
我不确定这是“最好的”方式,但我一直在使用Wildfly中的Google Guava cache(8到10但仍然适用)。对我来说,由于auth服务器非常慢,我正在缓存Oauth令牌。我的代码看起来像:
private static LoadingCache<String, MyPrincipal> tokenCacheMap;
@PostConstruct
private void postConstruct() {
tokenCacheMap = CacheBuilder.newBuilder()
.expireAfterAccess(15, TimeUnit.MINUTES)
.build(
new CacheLoader<String, MyUserPrincipal>() {
@Override
public MyUserPrincipal load(String token) {
MyUserPrincipal myUserPrincipal = getUserFromToken(token);
if( myUserPrincipal != null ) {
myUserPrincipal.setToken(token);
return myUserPrincipal;
}
throw new SecurityException("token is not valid");
}
}
);
}
//
// later in the code...
//
MyUserPrincipal myUserPrincipal = tokenCacheMap.get(token);
基本上这样做是设置一个缓存,令牌生存15分钟。如果需要,调用load()
方法,在这种情况下,获取身份验证令牌和用户。根据需要缓存填充缓存 - 第一次调用将获得获取令牌的开销,但之后它将全部存储在内存中。
还有其他选项,例如,根据缓存中的项目数量逐出旧信息。文档非常好,应该让你去。
缺点是这不是JEE标准,但它在过去对我有用。
答案 1 :(得分:1)
如果要使用JCache API,可以使用infinispan-jcache
。 Infinispan是一个可扩展,高度可用的键/值数据存储included in WildFly。
To use it,将infinispan-jcache
添加到pom.xml
:
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-jcache</artifactId>
<version>...</version> <!-- e.g. 9.1.4.Final -->
</dependency>
并访问缓存as follows:
import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.spi.CachingProvider;
...
// Construct a simple local cache manager with default configuration
CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
MutableConfiguration<String, String> configuration = new MutableConfiguration<>();
configuration.setTypes(String.class, String.class);
// create a cache using the supplied configuration
Cache<String, String> cache = cacheManager.createCache("myCache", configuration);
// Store a value, the entry will expire in 2 seconds
cache.put("key", "value", 2, TimeUnit.SECONDS);
// Retrieve the value and print it out
System.out.printf("key = %s\n", cache.get("key"));
// Stop the cache manager and release all resources
cacheManager.close();
请注意,Infinispan有great docs。