2012-04-26 2 views
3

여기 자바 서블릿 이야기 중 ... "자체 요청 별 컨텍스트"를 만드는 중이고 "Per Request Context"개체를 Thread.currentThread(). getId() 값에 연결하려고합니다.ThreadId를 통해 스레드의 끝을 어떻게 감지합니까?

대신이 컨텍스트 개체 주위를 지나가는 대신 사용자가 요청 단위 인 함수를 호출하고 해당 threadId의 해시 테이블에서 컨텍스트 개체를 자동으로 가져올 때 현재 스레드 ID를 확인할 계획을 세웠습니다.

이 같은 코드를 사용합니다 .. 나는() ExitContext를 호출하지 않는 잠재적 인 사용자로부터 자동으로 내 응용 프로그램을 보호하고자하지만

public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException 
{ 
    MyFramework.EnterContext(); 
    try { 
     // do stuff here that leads to other classes on the same thread 
     // Access current context via static MyFramework.getCurrentContext() 
    } 
    finally { MyFramework.ExitContext(); } 
} 

. C#에는 일회용 스레드 개체에 대한 이벤트 처리기가 있습니다 ... (제가 잘못 생각한 것 같습니다) 스레드가 종료 될 때 감지하거나 폴링하는 방법이 있습니까? 현재 threadId (long) 만 저장 중입니다.

아이디어가 있으십니까?

+0

여기가 기본이라고 생각합니다. 하나는 스레드를 사용하여 수행하는 작업이 잘못되었다고 생각합니다. 서블릿 컨텍스트 내에서 작업해야합니다. – ControlAltDel

+0

ServletContext는 시스템을 사용하는 모든 사용자를위한 것입니다. HttpSession은 현재 사용자를위한 것입니다. 내가 원하는 건 "요청 당"컨텍스트, 다른 사용자가 여러 요청을 ... 내 situtation 내 프레임 워크를 여러 사이트에서 사용할 수있는 페이지 및로드 된 비동기, 피하기 위해 노력하고있어. 사용 된 정보가 요청 당일 수 있기 때문에 동시에 실행됩니다. – xer21

답변

1

불행히도 Java의 스레드 용으로 만들어진 기능은 없습니다. 게다가, thread id는 어느 순간도 유일한 것이 보증되고 있습니다 만, thread가 없어져 (docs로부터) 재사용 될 가능성이 있습니다. 그러나 사용중인 서블릿 프레임 워크는 이러한 기능을 구현할 수도 있습니다 (추측).

서블릿 필터를 구현하고 사용자에게 web.xml에 포함 시키라고 알려주는 것이 좋습니다. 이를 통해 클라이언트 코드가 항상 스레드 컨텍스트에서 올바르게 wrap되는지 확인할 수 있습니다.

+0

그 추가 구성 대신에 문제가있는 경우 시도 {} 마침내 {} 마침내 {{}를 수행해야한다고 말하고 싶습니다. 제안을 주셔서 감사합니다 – xer21

+0

Weblogic이 ThreadPool을 사용하여 스레드를 실행하여 스레드가 절대로 죽지 않는다는 것을 알게 된 ThreadLocal 아이디어에 대한 연구가 끝난 후에이 답변에 대한 답을 찾았습니다. weblogic (및 Tomcat은 분명히) 스레드를 풀에 다시 넣을 때 ThreadLocal 변수를 정리하지 않습니다. 응용 프로그램을 다시 배포 한 후에 만 ​​응용 프로그램이 정리됩니다. 결국 서블릿 필터를 만드는 것이 안전한 유일한 방법으로 밝혀졌습니다. (FYI) Servlets 3.0을 사용하면 web.xml을 자동으로 등록 할 수 있으므로 web.xml이 필요하지 않습니다. – xer21

+0

나는 그것을 이해한다! 자동 등록, 유용한 소리에 대해 몰랐습니다! – rodion

1

ThreadLocal 완벽하게 사용하는 것으로 보입니다. ThreadLocal 객체는 스레드마다 변수를 저장하는 방법을 제공합니다. 이 클래스의 내부 작동은 사용자가 설명하는 것의 대부분을 차지하며, 맵을 사용하여 스레드 로컬 변수를 제공합니다. 이 같은

뭔가 트릭을 수행해야합니다

다른 문제에 관해서는
private static final ThreadLocal<UserContext> userContext = new ThreadLocal<UserContext>(); 

public void doPost(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
    MyFramework.EnterContext(); 
    try { 
     UserContext context = userContext.get(); 
     //if you used the set method in this thread earlier 
     //a thread local context would be returned using get 
    } 
    finally { MyFramework.ExitContext(); } 
} 

, 당신은 관찰자 패턴을 사용하여 스레드가 작업을 완료 할 때 알릴 수 있습니다.

+0

ThreadLocal을 연구하고 돌아올 것입니다. – xer21

+0

참고로 스레드는 docat (doPost())이 아니므로 Tomcat이 만들어 주므로 언급 한 것처럼 사용자가 try-finally를 수행하는 것이 좋습니다 ... 그러나 나는 네가 여기서 언급 한 것이 효과가있을 것이라고 생각한다. 하나의 질문이지만,이 방법으로 관찰 할 필요가없는 것으로 보입니다. 실제로 스레드에 첨부되어 있기 때문에 스레드가 사라지면 자동으로 수집을 수행해야합니다. 귀하의 예를 들어 이것은 올바른 사실일까요? 또는 어떤 시점에서 null로 userContext를 설정해야합니까? – xer21

+0

특히 Tomcat에 대한 정보를 발견했습니다. ThreadLocal이 삭제되지 않으면 tomcat> = 6.0.24의 새 버전에서 닫히는 것에 대해 경고하므로 나에게 충분합니다. > = 7.0.6 실제로 자동으로 수정됩니다. 따라서이 솔루션을 사용하고 try-finally를 사용하도록 지시하면 잘 작동합니다. – xer21

관련 문제