ID를 전달하지 않고 실행 중인 Java Applet 컨텍스트를 어떻게 식별할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/7269

  •  08-06-2019
  •  | 
  •  

문제

저는 꽤 큰 Swing Java 애플릿을 개발하는 팀의 일원입니다.우리 코드의 대부분은 레거시이며 수많은 싱글톤 참조가 있습니다.우리는 그것들을 모두 하나의 "애플리케이션 컨텍스트" 싱글톤으로 묶었습니다.이제 우리에게 필요한 것은 공유 컨텍스트(현재 표시되는 모든 애플릿에서 공유됨)와 비공유 컨텍스트(현재 표시되는 각 애플릿에 특정)를 분리하는 방법을 만드는 것입니다.

그러나 싱글톤을 호출하는 각 위치에는 ID가 없으며 ID를 모든 위치에 전파하고 싶지도 않습니다.우리가 실행 중인 애플릿 컨텍스트를 식별하는 가장 쉬운 방법은 무엇입니까?(클래스로더, 스레드 그룹, 스레드 ID를 조작해 보았습니다...지금까지 통화의 출처를 식별할 수 있는 방법을 찾을 수 없었습니다.

도움이 되었습니까?

해결책

싱글톤은 사악합니다. 무엇을 기대하시나요?;)

아마도 가장 포괄적인 접근 방식은 다른 클래스 로더에서 대량의 애플릿을 로드하는 것입니다(java.net.URLClassLoader.newInstance 사용).그런 다음 WeakHashMap을 사용하여 클래스 로더를 애플릿과 연결합니다.대부분의 코드를 공통 클래스 로더(각 애플릿별 클래스 로더의 상위)와 일반 애플릿 코드베이스로 분할할 수 있다면 속도는 더 빠르지만 작업량이 더 많아집니다.

기타 해킹:

구성 요소에 액세스할 수 있는 경우 Component.getParent를 반복적으로 사용하거나 SwingUtilities.getRoot를 사용할 수 있습니다.

애플릿별 인스턴스 스레드에 있는 경우 ThreadLocal을 설정할 수 있습니다.

EDT에서는 대기열(java.awt.EventQueue.getCurrentEvent())에서 현재 이벤트를 읽을 수 있으며, 가능하면 해당 이벤트에서 구성 요소를 찾을 수도 있습니다.또는 재정의된 DispatchEvent 메서드를 사용하여 EventQueue를 푸시합니다.

다른 팁

내가 올바르게 이해했다면 각 호출자 개체 또는 "컨텍스트"에 대해 서로 다른 "싱글톤" 개체를 얻는 것이 아이디어입니다.당신이 할 수 있는 한 가지는 현재 컨텍스트의 ID를 쓰는 스레드 로컬 전역 변수를 만드는 것입니다.(이 작업은 AOP로 수행할 수 있습니다.) 그런 다음 싱글톤 getter에서는 호출 컨텍스트에 대한 올바른 "싱글톤" 인스턴스에 대한 키로 사용하기 위해 스레드 로컬에서 컨텍스트 ID를 가져옵니다.

AOP에 관해서는 포인트 컷에 따라 조언이 컴파일 타임에 짜여지고 JAR이 런타임 종속성에 추가되므로 애플릿에서 사용하는 데 문제가 없습니다.따라서 런타임 시 AOP에 대한 특별한 증거가 남아 있어서는 안 됩니다.

threadlocal에 관한 @Hugo :

나는 그 해결책에 대해 생각했다.그러나 실험을 통해 나는 이 접근 방식에서 두 가지 문제점을 발견했습니다.

  1. 공유 스레드(서버 연결 등)에 문제가 있습니다.하지만 이 스레드에 특별한 주의를 기울이면 이 문제를 해결할 수 있습니다(이 스레드는 모두 내 통제하에 있으며 레거시 코드와 거의 격리되어 있습니다).
  2. EDT 스레드는 모든 애플릿에서 공유됩니다.각 애플릿에 대해 새로운 EDT 스레드를 강제로 생성하는 방법을 찾지 못했습니다.이는 EDT의 스레드 로컬이 애플릿 전체에서 공유된다는 것을 의미합니다.이건 어떻게 해결해야 할지 모르겠어요.제안?
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top