2009-08-23 6 views
2

각 응용 프로그램이 자체적 인 war 파일에있는 Java EE 환경에서 작업하고 있습니다. 각 응용 프로그램 war 파일의 WEB-INF/lib에는 모든 응용 프로그램에서 공유하는 공통 jar 파일이 있습니다. 이 공통 jar에는 코드의 여러 지점에서 액세스되는 여러 개의 Singleton이 포함되어 있습니다. war 파일 경계로 인해 각 응용 프로그램에는 자체 싱글 톤 인스턴스가 있습니다. 우리는 각 애플리케이션에서 서로 다른 싱글 톤을 다르게 구성하기를 원하기 때문에 현재 우리가 운영하는 방식이 있습니다.OSGI 환경에서 싱글 톤을위한 마이그레이션 솔루션

이제 각 번들마다 고유 한 클래스 로더가 있으므로이 솔루션이 더 이상 작동하지 않으므로 OSGi 환경에서 번들 "common.jar"번들 "appA"에있는 MySingleton에 액세스하려고하면이 솔루션이 더 이상 작동하지 않습니다. jar "또는 번들"appB.jar "에서 동일한 인스턴스를 가져옵니다.

번들 당 싱글 톤의 다른 인스턴스를 "원합니다"는 것을 기억하십시오. (소리가 나는 것과 같이 아이러니하게)

이제는 이상적인 해결책은 싱글 톤에 의존하지 말고 코드를 수정하는 것이지만, 빡빡한 스케줄로 인해 마이그레이션 솔루션을 제안 할 수 있는지 궁금합니다. 그렇게하면 번들 전체에 싱글 톤을 사용할 수있게되어 각각 번들 당 을 구성 할 수 있습니다.

답변

1

나는 몇 가지 옵션을 생각할 수 있습니다

  1. 는 WAR 번들에서 직접 common.jar에서 모든 클래스의 사본을 포함합니다. 은 OSGi 서비스를 사용하기 위해 싱글 톤을 수정 common.jar,
  2. 를 사용 :. 번들 - 클래스 경로 : 각 WAR 번들에서
  3. 둥지 common.jar 후 중첩 된 단지를 포함 MANIFEST.MF에 번들 클래스 경로를 수정 각 요청 번들이 자신의 서비스 인스턴스를 수신하는지 확인하는 ServiceFactory. 각 액세스에서 새 인스턴스를 가져 오지 않으려면 서비스 인스턴스를 캐싱 (get/use/unget)하지 않으면 안됩니다.
+0

옵션 2와 관련하여 OSGi는 war 파일로 작동합니까? OSGi 번들은 단순히 jar 파일이라고 생각했습니다. –

+0

번들을 JAR 파일의 인스턴스로 제한하는 OSGi 스펙에는 아무 것도 없습니다. WAR 지원의 예는 Spring DM과 OPS4J를 참조하십시오. – SteveD

2

귀하의 싱글 톤은 OSGi의 서비스가 될 것입니다.

그런 다음이 서비스의 다른 인스턴스를 등록 할 책임이있는 ManagedServiceFactory (예 : article 참조)를 만들어야합니다. 각 서비스는 서로 다른 등록 정보로 등록됩니다 (f.i.application = "appA"및 application = "appB")

그런 다음 올바른 등록 정보를 지정하여 정상적인 서비스 조회를 수행하는 모든 응용 프로그램에서 올바른 서비스에 액세스하게됩니다.

+1

또는 싱글 톤의 getter를 해킹하여 키당 싱글 톤을 반환 할 수있는 임의의 키 (예 : 번들 컨텍스트)를 가져옵니다. – SteveD

1

실제로 싱글 톤은 서비스에 매핑됩니다. 응용 프로그램 (appA, appB)이 실제로 번들이면 서비스를 ServiceFactory로 구현하십시오. 이렇게하면 모든 호출하는 번들에 대해 별도의 인스턴스를 자동으로 반환 할 수 있습니다. ManagedServiceFactory (각 인스턴스에 대해 명시 적 구성이 필요함) 또는 getter를 해킹하는 것보다 쉬울 것입니다.

관련 문제