2012-10-18 6 views
4

모든 요청에 ​​대해 많은 계산이 이루어집니다. 평균적으로 답장을 처리하는 데 약 10 분이 걸립니다. 이제 사용자가 새로운 요청을 보내는 경우; 이전 요청을 계속할 필요가 전혀 없습니다.이전 요청 취소

그래서 나는 그것을 실행하는 이전 스레드를 기본적으로 중단시키는 코드를 작성했습니다. 바람둥이 환경에서 좋은 연습인가요? 더 나은 해결책이있을 수 있습니까? tomcat 스레드를 인터럽트해도 괜찮습니까. 아니면 내 자신의 스레드 풀을 관리해야하고 풀에서 계산을 수행해야합니까?


추가 정보 : 는 기본적으로 모든 작업은 FutureTask에 싸여있다. 모든 요청에 ​​대해이 타스크가 실행되고 타스크에 대한 참조가 ConcurrentHashMap에 의해 저장됩니다. 모든 요청에 ​​대해지도의 모든 미래가 "취소됨"이어서 최신 요청을 실행합니다. 따라서 이전 요청을 취소합니다.

답변

2

가> 나는 기본적으로 그것을 실행 이전 스레드를 중단 Q, 바람둥이에 의해 할당 된 스레드를 중단하지 않을 것입니다. 바람둥이 환경에서 좋은 연습인가요?
> 10 분 동안 HTTP 스레드가 차단되어 있으면 행복하다고 생각합니다. 이는 다른 사용자가 HTTP 요청을 처리 할 수 ​​없음을 의미합니다. 그렇지 않으면 자체 스레드 풀을 만들고 관리하십시오.

Q> 바람둥이 환경에서 좋은 연습이십니까?
A> 인터럽트 Runnable 또는 Callable s는 까다로울 수 있습니다. 예를 들어 스레드가 I/O 작업 중간에 중단되면 데이터가 손상된 상태가 될 수 있습니다. 그것 이외에, 이것은 아주 정상적인 관행입니다. 또한 서버 용량을 예측할 수 있도록 고유 한 스레드 풀을 사용하는 것이 좋습니다.

큰 작업을 많은 작은 작업으로 나눌 수 있습니까? 조건을 지키고 일찍 퇴장하는 것이 방해 중단에 좋은 대안이 될 수 있습니다.

또는 첫 번째 작업이 작업을 완료 할 때까지 기다리는 것과 다른 작업자가 사용자 환경에서 동일한 값을 반환하는 경우를 기다리고 있습니까? 그렇다면, 나는 당신의 접근 대신에 그것을 선호 할 것입니다. 정확히 그 일을하는 구아바 도서관의 LoadingCache이 있습니다.

+0

감사합니다. 그러나 우리 자신의 스레드 풀을 여분의 오버 헤드로 유지하는 것은 아닙니다. 모든 요청에 ​​대해 여분의 스레드를 사용하는 곳. 둘째로 서버 용량에 어떤 영향을 줍니까? 나는 바람둥이가 요청에 따라 증가하는 수영장의 크기와 함께 CachedThreadPool을 사용한다고 생각했다. – Jatin

+0

처음에는 코드가 별도의 풀로 작성되었습니다. 그러나 나중에 그것을 포팅했습니다. 수영장을 가지고있는 몇 가지 장점이 있습니다.sesnse에서 당신은 소유하고 임의의 스레드가 아닌 스레드를 방해하고 있습니다. 그러나 나중에 오버 헤드로 인해 이식 됨. – Jatin

+0

서버 용량의 변화에 ​​신경 쓰지 않아도 HTTP 스레드에서 계속 블로킹 할 수 있습니다. 어쨌든, 직업 당 10 분이라는 맥락에서 새 스레드를 만드는 것은 비용이 거의 들지 않는다고 생각합니다. 또는 정적/공유 스레드 풀을 사용하는 경우 비용은 무시할 수 있습니다. – mindas

0

나는 완전히 질문을 이해 확실하지 오전

...하지만, 당신은 바람둥이 응용 프로그램 내에서 스레드를 실행하고 미래의 작업을 취소의 이야기하는 경우는, 그 아무 문제를 볼 수 없습니다. 내가 (예 : 서블릿 클래스 내에서 같은) 개인적으로 인터럽트 처리하는 코드를 작성하지 않는 한

나는

+0

예 인터럽트 상태를 처리 할 것입니다. 기본적으로 Interrupted Exception을 던지고 바로 위로, 작업이 취소되었다는 것을 알 수 있습니다. 이 접근법의 유일한 문제점은 다음과 같습니다. 취소를 요청한대로 작업 취소 또는 스레드 풀 사이에 차이가 없습니다 – Jatin