2013-06-25 6 views
1

localhost : 8080 에서 단일 Tomcat 서버를 실행하고 있습니다. 서버에 대해 여러 개의 스레드/요청을 실행하면 해당 요청에 대한 응답이 한 번씩 충돌합니다. 내 말은 앨리스와 밥이 요청을 보내면 앨리스가 밥에 속한 응답을받을 수도 있고 그 반대 일 수도 있다는 것입니다. 또한, 때때로 Alice와 Bob은 Alice의 요청을받을 수 있습니다. 아래 예를 참조하십시오. 참고 : 이는 단지 3 % 시간과 같지만 2000 년 요청 중 3 %는 많은 실패입니다.단일 tomcat 서버에서 응답이 충돌하는 여러 저지 클라이언트

  1. 앨리스 -> sendRequest1
  2. 밥 -> sendRequest2
  3. 앨리스 -> receiveResponse2
  4. 밥 -> receiveResponse1

내 질문은, 왜 이런 일이되어 않습니다되고 거기 주위에?

아마 뭔가 누락되었습니다.


다음은 기본 질문을 다룰 수있는 정보입니다. 나는 (적어도 주장 이잖아)

이것은 스레딩 문제가되지 않습니다 가정 스레드 안전되는 서버 (com.sun.jersey.api.client.WebResource) 얘기를 저지 API 클라이언트를 사용하고 . 1) 각 스레드가 클라이언트의 자체 인스턴스를 가지고 있는지 확인했습니다. 2) 여러 프로세스 (모두 단일 스레드)를 동시에 실행하여 동일한 결과를 발견했습니다.

서버 측에서 하나의 스레드로 실행했는데 충돌이 발생했습니다.

가 여기에 내가 HTTP에 대해 이해하는 바로는 (server.xml 파일에서) 내 카탈 구성

<Connector port="8080" protocol="HTTP/1.1" 
       maxThreads="10" minSpareThreads="0" maxSpareThreads="5" 
       URIEncoding="UTF-8" 
       connectionTimeout="20000" 
       redirectPort="8443" /> 

이며, 새로운 포트는 각 요청에 열 (또는 재사용)이다. 그러면 서버는 요청이 보낸 정확한 포트로 응답을 보내도록되어 있습니다. 이 경우 충돌이 발생하지 않아야합니다.

+1

웹 응용 프로그램의 기능은 무엇입니까? 다른 클라이언트를위한 응답임을 어떻게 알 수 있습니까? – Pyranja

+0

이것은 나에게 설정 문제와 같이 들리지 않습니다. 이것은 서버 측 스레드 문제와 유사합니다. 코드가 스레드 세이프 (threadsafe) 한 경우에만 서버는 스레드 안전합니다. 처리 클래스에 공유 상태 (정적 변수가 전형적인 경우)가 있습니까? (나는 서블릿이 맞습니까?) – DaveH

+0

"테스트"를 실행하고 있는데이 상황을 좁히는 한 가지 상황은 다른 데이터와 함께 동일한 호출이 전송 될 때 발생합니다. 호출 A는 오류가 발생했는지 확인하고 호출 B는 성공해야합니다. 그러나 A는 "예상 오류를받지 못했습니다"라고 말하고 B는 "예기치 않은 오류가 발생했습니다"라고 말합니다. 나는 당신이 응답이 교차하고 있다는 것을 절대적으로 확인할 수있는 방법이 있다면 제안에 개방되어 있습니다. –

답변