2012-07-26 5 views
2

내부 스레드에서 요청 객체에 접근이 코드는 서블릿서블릿

public void doPost(HttpServletRequest request, HttpServletResponse response) { 
    final HttpServletRequest requestF = request; 
    Runnable runner = new Runnable() { 
     public void run() { 
      String something = requestF.getParameter("anything"); 
      //do other things... 
     } 
    }; 
    Thread thread = new Thread(runner); 
    thread.start(); 

에서 실행해야하지만 요청 개체의 매개 변수를 얻을하려고 할 때 예외를 발생시킵니다.

Exception in thread "Thread-25" java.lang.NullPointerException 
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2560) 
    at org.apache.catalina.connector.Request.getParameter(Request.java:1086) 
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355) 
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158) 
    at br.com.test.controller.ajax.MyServlet$1.run(MyServlet.java:54) 
    at java.lang.Thread.run(Thread.java:619) 

requestF 개체가 null이 아닌지 확인했습니다. 누군가가 새로운 Thread 안에 요청 개체에 액세스 할 수 있는지 알고 있습니까?

+0

그냥 좀 더 명확하게하기 위해 : 나는 액세스하려면 'for()'문을 가지고 있고 다른'for()'문을 실행하고 싶지 않으므로 스레드 내부에서 요청하십시오. –

답변

1

예, Zaske가 맞습니다.

final Map<String,String> mapParameters = new HashMap<String,String>(); 
mapParameters.putAll(request.getParameterMap()); 

을하고 "실행"메서드 내 mapParameters을 사용합니다 : 이 같은지도 개체의 새 인스턴스를 사용하여 복사 할 수

public void doPost(HttpServletRequest request, HttpServletResponse response) { 
    final Map<String,String> mapParameters = new HashMap<String,String>(); 
    mapParameters.putAll(request.getParameterMap()); 
    Runnable runner = new Runnable() { 
     public void run() { 
      String something = mapParameters.get("anything"); 
      //do other things... 
     } 
    }; 
    Thread thread = new Thread(runner); 
    thread.start(); 
} 
+0

이것은 나를 위해 일했습니다. –

+0

@RenatoLochetti - 나도 신용 한게 아니야. 나는 또한 당신의 문제에 대해 생각할 시간과 노력을 주었다. –

1

실제로 요청은 null이 아닙니다.
나는 그것이 일어난 것으로 의심되는 것은 당신이 요청 객체에 대한 참조를 가지고 있기 때문에, GC가 그것을 수집하지 않았다는 것이다.
그러나 응답을 처리 한 후 매개 변수에 대한 정리 코드 (예 : 요청 매개 변수의 모든 항목 삭제)가 실행되었습니다.
이것은 메모리 자원을 해제하고 GC를 기다리지 않고 이런 일이 발생할 수 있었기 때문에 요청 객체에 대한 널 액세스가 아닌이 널 포인터 예외와 마주하고있는 이유 중 하나입니다. 매개 변수
매개 변수 컬렉션을 가져와 새 데이터 구조 (예 :지도)에 복사하고 스레드로 전달하는 것이 좋습니다.
추가적으로 클라이언트에게 응답을 보내기 전에 스레드를 실행 시키려고한다고 생각해야합니다.하지만 이는 단지 설계상의 문제입니다.

+0

Answser Zaske에게 감사드립니다. 나는 새로운 요청 객체가 낡은 것을 참조하는 것임을 깨닫지 못했다. –