Spring OSGi 环境中的抽象缓存
Spring Abstraction Cache in OSGi Environment
我在使 Spring 缓存在 OSGi 环境中工作时遇到问题。也许你可以告诉我我缺少什么。
我已经配置 Spring 缓存成功地在像
这样的测试中工作
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/spring-test.xml"})
public class CacheDictTest {
@Autowired
Dictionary dictionary;
@Test
public void getDict5Times() {
for (int i = 0; i < 5; i++) {
System.out.println(dictionary.getSourceDomains());
}
Assert.assertTrue(true);
}
}
select 执行一次,然后我有 5 个漂亮的打印件。
但是我不能让它在一个包中工作
Cacheable 注释似乎被忽略了。每次我调用 dictionary.getSourceDomains() 时都会执行查询。
我使用 ServiceMix 5.3.0 作为容器。
我的配置:
<cache:annotation-driven cache-manager="cacheManager"/>
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="dictionary"/>
</set>
</property>
</bean>
词典:
public class DictionaryImpl implements Dictionary {
private DictionaryDao repository;
public DictionaryDao getRepository() {
return repository;
}
public void setRepository(DictionaryDao repository) {
this.repository = repository;
}
@Override
public List<String> getSourceDomains() {
List<DictEntry> entries = repository.getDictionary(DictTypeEnum.SOURCE_DOMAIN);
List<String> domains = new ArrayList<>();
for(DictEntry entry : entries) {
domains.add(entry.getKey());
}
return domains;
}
}
和道
public class DictionaryDaoImpl extends BaseDaoImpl implements DictionaryDao {
private static final Logger LOG = LoggerFactory.getLogger(DictionaryDaoImpl.class);
@Override
@Cacheable(value="dictionary", key="#type")
public List<DictEntry> getDictionary(DictTypeEnum type) {
LOG.info("Loading {}", type);
Query q = getSession().createQuery("from DictEntry where type=:type");
q.setParameter("type", new DictType(type.getTypeId()));
List results = q.list();
LOG.debug("Results {}", results);
return results;
}
}
我试过的
- 将@Cacheable 注释移至 DictionaryDao(接口)、DictionaryImpl 或 Dictionary(接口)- 无效。
- 使用不同的缓存实现(ehcache 而不是 JDK 基于 ConcurrentMap 的缓存)- 无效
问题是在 osgi 清单中缺少导入可缓存注释包。
org.springframework.cache.annotation
Servicemix 没有显示任何缺少 class 的错误,只是让服务忽略 Cacheable 注释。
我在使 Spring 缓存在 OSGi 环境中工作时遇到问题。也许你可以告诉我我缺少什么。
我已经配置 Spring 缓存成功地在像
这样的测试中工作@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/spring-test.xml"})
public class CacheDictTest {
@Autowired
Dictionary dictionary;
@Test
public void getDict5Times() {
for (int i = 0; i < 5; i++) {
System.out.println(dictionary.getSourceDomains());
}
Assert.assertTrue(true);
}
}
select 执行一次,然后我有 5 个漂亮的打印件。
但是我不能让它在一个包中工作
Cacheable 注释似乎被忽略了。每次我调用 dictionary.getSourceDomains() 时都会执行查询。 我使用 ServiceMix 5.3.0 作为容器。
我的配置:
<cache:annotation-driven cache-manager="cacheManager"/>
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="dictionary"/>
</set>
</property>
</bean>
词典:
public class DictionaryImpl implements Dictionary {
private DictionaryDao repository;
public DictionaryDao getRepository() {
return repository;
}
public void setRepository(DictionaryDao repository) {
this.repository = repository;
}
@Override
public List<String> getSourceDomains() {
List<DictEntry> entries = repository.getDictionary(DictTypeEnum.SOURCE_DOMAIN);
List<String> domains = new ArrayList<>();
for(DictEntry entry : entries) {
domains.add(entry.getKey());
}
return domains;
}
}
和道
public class DictionaryDaoImpl extends BaseDaoImpl implements DictionaryDao {
private static final Logger LOG = LoggerFactory.getLogger(DictionaryDaoImpl.class);
@Override
@Cacheable(value="dictionary", key="#type")
public List<DictEntry> getDictionary(DictTypeEnum type) {
LOG.info("Loading {}", type);
Query q = getSession().createQuery("from DictEntry where type=:type");
q.setParameter("type", new DictType(type.getTypeId()));
List results = q.list();
LOG.debug("Results {}", results);
return results;
}
}
我试过的
- 将@Cacheable 注释移至 DictionaryDao(接口)、DictionaryImpl 或 Dictionary(接口)- 无效。
- 使用不同的缓存实现(ehcache 而不是 JDK 基于 ConcurrentMap 的缓存)- 无效
问题是在 osgi 清单中缺少导入可缓存注释包。
org.springframework.cache.annotation
Servicemix 没有显示任何缺少 class 的错误,只是让服务忽略 Cacheable 注释。