【发布时间】:2014-11-02 10:52:21
【问题描述】:
我正在使用单例 bean 向我的 Java EE 应用程序提供存储在数据库中的配置值。
@Singleton
public class ConfigurationProvider {
private final Map<String, ConfigurationEntity> configMap = new HashMap<>();
@PersistenceContext(unitName = DatabaseConstants.PERSISTENCE_UNIT)
private EntityManager em;
public String getConfiguration(String key) {
if (configMap.containsKey(key)) {
return configMap.get(key).getValue();
}
ConfigurationEntity config = em.find(ConfigurationEntity.class, key);
em.detach(config);
if (config == null) {
throw new RuntimeException("Configuration not found for " + key);
}
configMap.put(key, config);
return config.getValue();
}
public void clear() {
configMap.clear();
}
public Collection<ConfigurationEntity> getCurrentConfigurationState() {
return configMap.values();
}
}
生产者让我注入值
public class ConfigurationProducer {
@Inject
private ConfigurationProvider configProvider;
@Produces
@ConfigurationValue
public String getConfiguration(InjectionPoint ip) {
String key = createKey(ip);
return configProvider.getConfiguration(key);
}
这里是一个例子
@Inject
@ConfigurationValue
private Instance<String> endpoint;
这会从数据库中加载端点。出于测试原因,该值应该是可变的。 所以你看到的是一个 ejb 模块的一部分。
为了重新加载这些值,我创建了一个提供该功能的 REST 接口。此 REST 服务是与 ejb 模块一起打包在一个 ear 文件中的附加 WAR 的一部分。
@Path("/configuration")
public class ConfigurationResource {
@EJB
private ConfigurationProvider configurationProvider;
@GET
@Path("/current")
@Produces({ "application/json" })
public Collection<ConfigurationEntity> getCurrentConfiguration() {
return configurationProvider.getCurrentConfigurationState();
}
}
但问题是,战争有它自己的配置提供者实例。所以我无法重新加载“缓存”。 为什么我的单例中有两个实例在同一个耳朵里?
【问题讨论】:
标签: java rest singleton jboss7.x java-ee-6