2011-03-11 2 views
5

주 서블릿의 doService 메소드 (메인 웹 컨테이너 스레드에서)에서 HttpServletRequeset 및 HttpServletResponse를받을 때 처리 할 A 스레드, B 스레드, C 스레드 세 개 (스레드가 자체 프로그램에서 관리)를 시작합니다. 다른 병렬 모드에서 서블릿, 다음 천천히 작동 메인 스레드에서 이러한 서블릿에서 각 응답에 참여하고, 내 자신의 스레드 중 하나가 (A 스레드를 가정), 메인 스레드가 완료됩니다, 그래서 주요 응답은 을 user.and 돌아갑니다 스레드가 제대로 작동해야합니다., 나중에 브라우저 측면에서 AJAX를 사용하여 A 스레드의 응답을 요청합니다.Servlet Container가 제공하는 분리 된 HttpServletRequest 및 HttpServletResponse를 복제하는 방법은 무엇입니까?

그래서, 나는 HttpServlettRequest와 HttpServletResponse를 서블릿 컨테이너에서 제공을 복제 할 및 복제 요청 및 응답 (컨테이너의 HttpServletTrequest와 HttpServletResponse를 완성, 복제 된 요청 및 reponse가 여전히 제대로 작동) 분리해야합니다. 복제 된 요청과 응답의

없이 행동은 컨테이너의 내 코드의 view.It에서 다음과 포함될 수와 동일해야합니다.

아이디어가 있으십니까?

대단히 감사합니다. 당신이 HttpRequest를하고 HttpResponse에 개체에 대리자 역할을하고 프로세스의 Runnable 객체에 대한 참조를 전달하는 클래스를 만들 필요가 같은

L.J.W

+1

수 없습니다. 기간. 기능 요구 사항은 무엇입니까? 그런 다음 기능 요구 사항을 달성하기 위해 더 적합한 답변/제안을 제공 할 수 있습니다. – BalusC

답변

3

는 소리.

는 (마음에 inputstream의 스프링에서 읽기)는 HttpRequest를 객체에 한 번 수행 할 수 있습니다 특정 작업이 있습니다, 대리자 클래스는이 음식을 장만해야 할 것입니다.

하지 당신이 A, B 및 C 스레드가 비록 HttpResponse에 개체에 충돌하는 변경을 할 경우 수행 할 예정하는지 확인합니다.

는 내가 처리 스레드를 통해 HttpResponse에 객체를 전달하고 제어 서블릿 클래스

+0

복제 된 요청을 원하고 응답을 분리 할 수 ​​있으므로 참조를 전달할 수 없습니다 (랩 메소드를 사용할 수 없음) –

+1

@LJW : 당신이 말하는 것은 전혀 이해가되지 않습니다. "참조를 전달할 수 없습니다."그러면 Java를 사용하면 안됩니다. –

+1

@ L.J.W 응답을 보내면 응답을 사용할 때 _get_하지 않으려 고합니다. 정의되지 않은 동작입니다. 즉, 스트림이 (아마도) 닫혀 있기 때문에 충돌이 발생합니다. – extraneon

2

난 당신이 HttpServletRequest의 대부분을 요청하는 생각에서 응답을 채우는 논리를 떠나 선호하는 거라고 생각합니다. 요청이 완료되면 요청 개체가 어떤 용도로 사용되는지 의지해서는 안됩니다. 어쨌든 대부분의 경우 J2EE 컨테이너 내부의 스레딩을 권장하지 않지만 이는 다른 문제입니다.

요청을 병렬로 처리해야하는 경우 요청 개체에서 필요한 데이터를 추출하여 스레드로 보내고 저장할 수있는 HttpSession을 제외하고 주로 Servlet을 무지하게 만드는 것이 좋습니다 Ajax 검색을 위해 계산 된 값.

+0

스레드가 servletrequet과 응답을 처리해야합니다. 다른 데이터 형식을 보낼 수 없습니다 .. –

+0

@ L.J.W 즉, 사용자 지정 HttpRequest 및 HttpResponse를 구현하고 주어진 요청 및 응답에서 복사 된 데이터로 초기화해야합니다. 작동하지 않는 스트림을 복사하지 마십시오. – extraneon

3

요청 및 응답 클래스는 복제 또는 여러 스레드에서 액세스 할 수 있도록 설계되어 있지 않습니다. 그렇게하려고하면 문제가 생길 수 있습니다. 나는 당신이 당신의 요구 사항을 다시 생각해 보길 권한다.

5

HTTP 요청 및 응답을 복제하는 것은 HttpServletResponseWrapper 클래스 http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServletResponseWrapper.html를 통해 가능하다. Sun 설명서 https://web.archive.org/web/20120626033905/http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets8.html에서 사용 예를 찾을 수 있습니다.

커밋 전에 요청 및 응답 정보를 수정할 수있는 계획이 없었기 때문에이 문제를 해결할 수 있었던 Sun의 문제가 해결되었습니다.

랩퍼를 사용하여 HTTP 정보 사본을 만들고 다른 스레드로 전달할 수 있습니다.

관련 문제