2014-04-30 1 views
0

Java에서 연결 시간 초과없이 http 상태를 반환 할 수 있도록 다른 스레드에서 일부 장기 실행 프로세스를 시작하는 웹 서비스가 있습니다.다른 스레드에서 Java ExecuterCompletionService take.get()

내 질문에는 ExecuterCompletionService.take.get()을 실행하여 처리가 완료된 스레드를 얻고 처리를 완료하는 단일 실행 스레드가 작성되었습니다.

완료 서비스가 주 스레드에서 생성되면 해당 스레드에서 완료된 개체를 실행해도 괜찮습니까?

EG. 모든 200 의 HTTP 상태를 반환 잘 갔다 경우

MainThread

  1. 작성 완료 서비스
  2. 완료 서비스
  3. 에 호출 가능 제출 요청을 수락하고 장기 실행 프로세스를
  4. 를 만들

    모니터 스레드

    1. 기본 스레드에서 작성된 완료 서비스에 대한 참조를 저장하십시오.
    2. 실행 completionservice.take.get()
    3. 이 완료된 작업에 대한 보고서를 생성
    4. repeate

    내가 간과했는지에 대해 걱정할 필요가 특별한 있나요? 동기화 문제와 같습니다. 내부적으로 완료 서비스가 차단 대기열을 사용한다는 것을 알고 있습니다.

+0

따라서 하나의 완료 서비스가 제공되며 여러 요청을 수락하고 제출할 수 있습니다. 다른 스레드에서는 순차적으로 처리하고 있습니다 (get() - get()은 현재 스레드가 완료 될 때까지 대기합니다). JMS를 재발견하려고합니까? – Mani

+0

JMS? 나는 이것에 대해 더 살펴볼 것이다. 고맙습니다. 또한 단순히 프로세스를 시작하기위한 put 요청이 시간 초과되지 않도록 webservice 스레드를 차단하지 않으려 고합니다. – twreid

+0

예, 완료 서비스의 단일 인스턴스를 유지하는 한 귀하의 접근 방식에 문제가 나타나지 않습니다. 이러한 종류의 문제를 해결하기 위해 JMS/MDB를 사용할 수 있습니다. 100 개의 요청을 제출하고 5 개의 요청을 완료했다고 가정합니다. 지금 서버가 다운/크래시. 귀하의 접근 방식에서 모든 리밍 요청은 사라졌습니다. JMS를 사용하면 걱정할 필요가 없습니다. 다시 전달되므로 요청을 저장하는 데 JVM을 사용할 필요가 없습니다. – Mani

답변

1

IMHO, 복수 호출 가능 작업을 제출하는 데 사용되는 ExecutorCompletionService 인스턴스를 유지하는 한 접근 방식에 문제가 없습니다.

이 방법에서는 서버가 다운되거나 충돌 할 때 실행중인 작업 결과를 잃게됩니다. 그리고 JVM 메모리를 사용하여 작업을 유지합니다. 다시 말하지만 요청의 양과 작업의 수는 병렬로 실행되며 작업을 완료하는 데 걸리는 시간에 따라 달라집니다.

모든 요청을 동시에 실행하도록 요청하지 않으면 JMS가 가장 적합 할 것입니다. 장기 실행 프로세스에 대한 요청 시간 제한을 피하기 위해 작업을 JMS에 배치 할 수 있으며 나중에 작업을 JMSlistener (Message Listener/MDB)을 통해 소비하고 하나씩 처리 할 수 ​​있습니다.

+0

모든 도움을 주셔서 대단히 감사합니다. :) – twreid

관련 문제