2008-08-10 5 views
6

저는 꽤 큰 Swing Java Applet을 개발하는 팀의 일원입니다. 우리 코드의 대부분은 유산이며, 많은 싱글 톤 참조가 있습니다. 우리는이 모든 것을 하나의 "Application Context"싱글 톤으로 묶었습니다. 현재 필요한 것은 공유 컨텍스트 (현재 표시된 모든 애플릿간에 공유 됨)와 비공유 컨텍스트 (현재 표시된 각 애플릿에만 해당)를 분리하는 몇 가지 방법을 만드는 것입니다.ID를 전달하지 않고 실행중인 Java 애플릿 컨텍스트를 어떻게 식별 할 수 있습니까?

그러나 우리는 싱글 톤을 호출하는 각 위치에 ID가 없으며 모든 위치에 ID를 전파하려고합니다. 실행중인 애플릿 컨텍스트를 식별하는 가장 쉬운 방법은 무엇입니까? (나는 클래스 로더, 쓰레드 그룹, 쓰레드 ids를 망쳐 놓으려고 노력했다. 지금까지 나는 호출의 기원을 ID화할 수있는 아무것도 찾을 수 없었다).

답변

2

싱글 톤은 악합니다. 무엇을 기대합니까? ;)

아마도 가장 포괄적 인 접근법은 다른 클래스 로더 (java.net.URLClassLoader.newInstance 사용)에서 대량의 애플릿을로드하는 것일 수 있습니다. 그런 다음 WeakHashMap을 사용하여 클래스 로더를 애플릿과 연관시킵니다. 대부분의 코드를 공통 클래스 로더 (애플릿별로 클래스 로더의 부모)와 일반 애플릿 코드베이스로 나눌 수 있다면 더 빠르지 만 더 많은 작업이 가능합니다.

다른 해킹 : 당신이 어떤 구성 요소에 액세스 할 수있는 경우

, 당신이 반복적으로 또는 SwingUtilities.getRoot Component.getParent를 사용할 수 있습니다.

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

EDT에서 대기열 (java.awt.EventQueue.getCurrentEvent())에서 현재 이벤트를 읽을 수 있으며 그 이벤트에서 구성 요소를 찾을 수 있습니다. 또는 재정의 된 dispatchEvent 메소드로 EventQueue를 푸시하십시오.

+0

이것은 내가 본 주제에서 가장 훌륭한 아이디어 모음입니다. 나는 특히 "맞춤 이벤트 큐를 밀어 넣는 것"을 좋아한다. 나는 그것을 시도 할 것이다. –

0

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

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

0

@Hugo는 :

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

  1. 공유 스레드 (서버 연결 등)에 문제가 있습니다. 이것은 스레드에 특별한주의를 기울임으로써 해결할 수 있습니다 (모두 내 제어하에 있으며 레거시 코드와 거의 분리되어 있습니다).
  2. EDT 스레드는 모든 애플릿에서 공유됩니다. 각 애플릿에 새로운 EDT 스레드를 강제로 생성하는 방법을 찾지 못했습니다. 즉, EDT 용 스레드 로컬은 애플릿간에 공유됩니다. 이 하나는 해결 방법을 모릅니다. 제안?
+0

아카이브 태그에 다른 값을 사용하여 새 EDT 스레드를 가져올 수 있어야합니다.존재한다고해도 무작위 항아리 이름을 끝에 추가 할 수 있다고 생각합니다. –