브라우저 호환성 문제로 인해 실시간 동기화 및 알림 시스템에 긴 폴링을 사용하기로 결정했습니다. 나는 백엔드에서 Java를 사용하고 있으며, 지금까지 발견 한 모든 예제는 PHP였다. 그들은 while 루프와 sleep 메서드를 사용하는 경향이 있습니다. Java에서 이런 종류의 것을 어떻게 복제합니까? Thread.sleep()
방법이 있는데, 설문 조사를 발행하는 각 사용자마다 별도의 스레드를 사용해야합니까? 별도의 스레드를 사용하지 않으면 폴링 요청이 서버를 차단합니까?Java Long 폴링 : 별도의 스레드?
답변
모두의 [업데이트] 먼저, 그래 그것은 간단 긴 폴링 요청 처리기를 할 확실히 가능하다. 요청은 서버로 전달 된 다음 처리기에서 필요한 정보를 사용할 수있을 때까지 루프하거나 차단 한 다음 루프를 종료하고 정보를 제공합니다. 그냥 긴 폴링 클라이언트마다 예, 당신은 스레드를 묶을 것입니다. 이것은 좋을지도 모릅니다. 그리고 이것이 아마도 당신이 시작해야 할 길입니다. 그러나 웹 서버의 인기가 높아져서 차단 스레드 수가 성능상의 문제가되고있는 경우 많은 요청이 대기중인 비동기식 솔루션을 고려하십시오. 요청이 차단되고 거기까지 응답하지 않습니다. 클라이언트 당 하나 이상의 스레드를 묶지 않고 유용한 데이터입니다.
는 [일본어]
서블릿 3.0 스펙 이런 비동기 처리를 수행하기위한 기준을 제공한다. 구글 "서블릿 3.0 비동기". Tomcat 7이이를 지원합니다. 나는 부두도 마찬가지라고 생각하지만, 나는 그것을 사용하지 않았다.
기본적으로 서블릿 요청 처리기에서 "긴"폴링을해야한다는 것을 알게되면 비동기 컨텍스트를 만드는 메소드를 호출 할 수 있습니다. 그런 다음 요청 처리기를 종료하고 스레드가 해제되지만 클라이언트가 여전히 요청을 차단하고 있습니다. 잠을 자거나 기다릴 필요가 없습니다.
트릭은 비동기 컨텍스트를 "편리한"곳에 저장하는 것입니다. 그런 다음 앱에서 무언가가 발생하여 데이터를 클라이언트에 전달하려는 경우 해당 컨텍스트를 찾아서 거기에서 응답 객체를 가져 와서 내용을 작성하고 complete를 호출합니다. 응답은 각 클라이언트에 대한 스레드를 묶지 않아도 클라이언트에 다시 전송됩니다.
알았어요. 내가 항상 완료되었다고 가정 한 방식은 아약스 요청을 보내서 사용자에게 계속 공개 한 다음 백엔드 클래스의 루프를 실행하고 응답이 가능할 때 요청에 응답하는 것입니다. . 내가 아약스 요청을 공개하지 않았다고 제안하는거야? – ryandlf
업데이트를 참조하십시오. 내 요점은 반드시 스레드를 묶지 않고 각 클라이언트에 대해 요청을 열어 둘 수 있다는 것입니다. 원할 경우 루프에서 스레드를 확실히 묶을 수 있습니다. –
나는 그것을 조사해야 할 것이다. 아마도 이것이 내 대답 일 것이다. 고맙습니다. – ryandlf
이것이 가장 적합한 솔루션인지는 모르겠지만 일반적으로 Java의 기간 간격으로이 작업을 수행하려는 경우 ScheduleExecutorService을 사용하십시오. API 문서 맨 위에 좋은 예가 있습니다. TimeUnit은 기간을 쉽고 명확하게 지정할 수 있으므로 훌륭한 열거 형입니다. 그래서 당신은 모든 X 분을 실행하도록 지정할 수 있습니다, 시간 등
정말 긴 폴링을 원하십니까? (또는) 당신은 역 아약스 (혜성) 같은 것을 좋아합니까? – kosa
필자는 내 자신의 경량급 서비스를 구현하고 싶다. 그래서 혜성 아웃했다. 하지만 네, 기본적으로 리버스 아약스입니다. – ryandlf