2014-02-27 15 views
1

답변을 제공하기 위해 여러 서비스에 여러 연결을해야하는 httpservlet이 있습니다. 이러한 요청은 거의없고 서블릿 자체에 대한 호출은 아약스 (Ajax)에 의해 수행되며, 동시에 내가 만드는 것은 단지 몇 명의 사용자가 동시에 사용할 프로그램을위한 웹 인터페이스 일뿐입니다.서블릿에 스레드 풀을 만드는 것이 좋지 않습니까?

이제는 서블릿에 스레드 풀을 인스턴스화하고 내 작업을 실행하는 방법에 대해 배우자가 계속하기 전에 각 스레드가 완료되었는지 확인합니다.

어쨌든 서블릿 내부의 스레딩 스레드는 나쁜 습관입니다. 하지만 이러한 연결을 병렬로 만드는 것이 내 문제를 해결하는 가장 좋은 방법입니다.

그래서 무엇을 제안합니까? 가장 좋은 방법은 무엇입니까?

+0

단일 노드 (클러스터가 아닌) 서블릿 컨테이너 (tomcat, jetty) 또는 전체 애플리케이션 서버를 사용합니까? –

+0

그게 틀림 없습니다. 서블릿에 스레드를 만들지 마십시오. 단일 스레드 풀을 사용하여 서비스를 만들고 여기에 작업을 위임합니다. – Stefan

답변

2

"나쁜 생각"이 아니지만 신중하게해야합니다. 서버 부하, 메모리 및 CPU 사용량 등에 따라 ... 가장 좋은 방법 일 수 있습니다. 우리는 항상 내 일에 그것을한다.

시작하기 좋은 곳은 스레드 풀을 사용하는 것입니다. Java 1.5+는 이것에 대한 훌륭한 클래스를 가지고 있습니다. ExecutorService

모든 서블릿 요청이나 요청 당 하나의 풀에 대해 공유되는 단일 풀을 생성 할 수 있습니다.

공유 풀을 사용하면 이러한 작업자 스레드의 절대적인 상한선을 얻을 수 있습니다. 요청 당 새 스레드가 있으면 서블릿 요청 간의 상호 작용을 유지할 수 있습니다 (하나의 요청으로 모든 스레드를 포기할 수 없음).

그러나 사용 사례를 고려해야 할 대안으로, 사용하는 라이브러리에 따라 단일 스레드로 여러 HTTP 호출을 처리하는 방법이 있습니다. 그들은 무대 뒤에서 니오를 사용할 것입니다. 나는 나의 머리의 꼭대기로부터 떨어져서 누구의 이름도 알지 않는다.

+0

스레드 풀에 대해서는 이미 알고 있지만이 서버의 doGet 메서드 내부에서 만들고 삭제하고 싶었습니다. 유일한 기능은 스레드 스팸을 방지하기 위해 스레드 생성을 조절하는 것입니다. 괜찮습니까? 그리고 더 나은 fixedThreadPool 또는 캐시 된 것? – Phate

+0

doGet에서 수행하고 있고 필요한 스레드 수를 알고 있다면 fixedThreadPool이 더 좋습니다. 공유 된 것을 수행 중이거나 필요한 스레드의 수를 모르는 경우 캐싱 *이 더 좋을 수 있습니다. – Daniel

관련 문제