Java에서 연결 시간 초과없이 http 상태를 반환 할 수 있도록 다른 스레드에서 일부 장기 실행 프로세스를 시작하는 웹 서비스가 있습니다.다른 스레드에서 Java ExecuterCompletionService take.get()
내 질문에는 ExecuterCompletionService.take.get()을 실행하여 처리가 완료된 스레드를 얻고 처리를 완료하는 단일 실행 스레드가 작성되었습니다.
완료 서비스가 주 스레드에서 생성되면 해당 스레드에서 완료된 개체를 실행해도 괜찮습니까?
EG. 모든 200 의 HTTP 상태를 반환 잘 갔다 경우
MainThread
- 작성 완료 서비스
- 완료 서비스
- 에 호출 가능 제출 요청을 수락하고 장기 실행 프로세스를
- 를 만들
모니터 스레드
- 기본 스레드에서 작성된 완료 서비스에 대한 참조를 저장하십시오.
- 실행 completionservice.take.get()
- 이 완료된 작업에 대한 보고서를 생성
- repeate
내가 간과했는지에 대해 걱정할 필요가 특별한 있나요? 동기화 문제와 같습니다. 내부적으로 완료 서비스가 차단 대기열을 사용한다는 것을 알고 있습니다.
따라서 하나의 완료 서비스가 제공되며 여러 요청을 수락하고 제출할 수 있습니다. 다른 스레드에서는 순차적으로 처리하고 있습니다 (get() - get()은 현재 스레드가 완료 될 때까지 대기합니다). JMS를 재발견하려고합니까? – Mani
JMS? 나는 이것에 대해 더 살펴볼 것이다. 고맙습니다. 또한 단순히 프로세스를 시작하기위한 put 요청이 시간 초과되지 않도록 webservice 스레드를 차단하지 않으려 고합니다. – twreid
예, 완료 서비스의 단일 인스턴스를 유지하는 한 귀하의 접근 방식에 문제가 나타나지 않습니다. 이러한 종류의 문제를 해결하기 위해 JMS/MDB를 사용할 수 있습니다. 100 개의 요청을 제출하고 5 개의 요청을 완료했다고 가정합니다. 지금 서버가 다운/크래시. 귀하의 접근 방식에서 모든 리밍 요청은 사라졌습니다. JMS를 사용하면 걱정할 필요가 없습니다. 다시 전달되므로 요청을 저장하는 데 JVM을 사용할 필요가 없습니다. – Mani