Quarkus是否支持SOSS Cache?迁移SpringBoot遇JCache配置加载问题
问题:Quarkus迁移后Scaleout SOSS缓存无法加载Jcache配置
我们团队选用scaleoutsoftware/SOSS作为内存缓存方案,在SpringBoot环境下运行正常,但将应用迁移至Quarkus后,SOSS无法正常工作。Quarkus似乎无法正确加载或处理application.yml中的Jcache配置,注入CacheManager时出现依赖不满足的错误。
现有配置(application.yml)
quarkus: cache: type: jcache jcache: provider: com.scaleoutsoftware.soss.cache.ScaleoutCachingProvider
代码片段
@Autowired private javax.cache.CacheManager cacheManager;
启动错误日志
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type javax.cache.CacheManager and qualifiers [@Default] - java member: com.***.cache.DataCacheManager#cacheManager - declared on CLASS bean [types=[com.***.cache.DataCacheManager, java.lang.Object], qualifiers=[@Default, @Named(value = "dataCacheManager"), @Any], target=com.***.cache.DataCacheManager]
解决建议
修正配置文件缩进问题
Quarkus的YAML配置对缩进要求严格,你当前的配置中type: jcache缩进错误,导致cache节点下的配置不被正确解析。修正后的配置应为:quarkus: cache: type: jcache jcache: provider: com.scaleoutsoftware.soss.cache.ScaleoutCachingProvider确保引入正确的Quarkus缓存扩展
Quarkus的Jcache支持需要单独引入扩展,在Maven的pom.xml中添加依赖:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-cache-jcache</artifactId> </dependency>同时确认SOSS的客户端依赖已正确引入,且版本与Quarkus兼容。
替换@Autowired为CDI标准注解
Quarkus基于CDI规范,虽然兼容Spring的@Autowired,但更推荐使用标准的@Inject注解来注入依赖:import javax.inject.Inject; import javax.cache.CacheManager; public class DataCacheManager { @Inject private CacheManager cacheManager; // 业务逻辑 }验证SOSS Provider类的可访问性
检查类路径中是否存在SOSS的jar包,且com.scaleoutsoftware.soss.cache.ScaleoutCachingProvider类能被正常加载。可添加JVM启动参数-verbose:class,查看该类的加载日志,确认没有类找不到的问题。手动创建CacheManager Bean(兜底方案)
如果自动配置仍失效,可以手动编写CDI Producer来初始化SOSS的CacheManager:import javax.cache.CacheManager; import javax.cache.Caching; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; public class CacheManagerProducer { @Produces @ApplicationScoped public CacheManager produceCacheManager() { return Caching.getCachingProvider("com.scaleoutsoftware.soss.cache.ScaleoutCachingProvider") .getCacheManager(); } }
内容的提问来源于stack exchange,提问作者user1601373
相关产品推荐
相关产品推荐

