싱글 톤 빈을 사용하여 데이터베이스에 저장되어있는 구성 값을 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();
}
}
프로듀서
날 값 여기에 예를 들어@Inject
@ConfigurationValue
private Instance<String> endpoint;
이 데이터베이스에서 endpont를로드
public class ConfigurationProducer {
@Inject
private ConfigurationProvider configProvider;
@Produces
@ConfigurationValue
public String getConfiguration(InjectionPoint ip) {
String key = createKey(ip);
return configProvider.getConfiguration(key);
}
를 주입 할 수 있습니다. 테스트 목적으로, 값은 변경 가능해야합니다. 그래서 본 것은 ejb 모듈의 일부입니다.
값을 다시로드하려면 기능을 제공하는 REST-Interface를 만들었습니다. 이 REST 서비스는 하나의 ear 파일에 ejb 모듈과 함께 패키지 된 추가 WAR의 일부입니다.
@Path("/configuration")
public class ConfigurationResource {
@EJB
private ConfigurationProvider configurationProvider;
@GET
@Path("/current")
@Produces({ "application/json" })
public Collection<ConfigurationEntity> getCurrentConfiguration() {
return configurationProvider.getCurrentConfigurationState();
}
}
그러나 문제는 전쟁에 구성 제공자의 인스턴스가 있다는 것입니다. 그래서 나는 '캐시'를 다시로드 할 수 없습니다. 같은 귀에 내 싱글 톤 인스턴스가 두 개있는 이유는 무엇입니까?
안녕 bitkot, 두 모듈은 동일한 귀 파일에 있습니다. – boskop