문제

편집하다

이 질문은 지금까지 몇 차례 반복되었으므로 수정된 내용을 살펴보고 시도한 내용과 기록에 대한 배경 정보를 확인하세요.


나는 CXF 생성 코드를 통해 몇 가지 다른 웹 서비스에서 여러 함수를 동시에 호출하기 위해 ExecutorService 및 Callable과 함께 CompletionService를 사용하고 있습니다.이러한 서비스는 모두 제가 프로젝트에 사용하는 단일 정보 세트에 대해 서로 다른 정보를 제공합니다.그러나 서비스는 예외를 발생시키지 않고 장기간 응답하지 않아 결합된 정보 집합에 대한 대기 시간이 길어질 수 있습니다.

이에 대응하기 위해 나는 모든 서비스 호출을 동시에 실행하고 있으며 몇 분 후에 아직 완료되지 않은 호출을 종료하고 바람직하게는 호출 가능 항목 내에서 또는 던져서 아직 완료되지 않은 호출을 기록하고 싶습니다. 자세한 예외.

다음은 제가 이미 수행 중인 작업을 설명하기 위해 매우 단순화된 코드입니다.

private Callable<List<Feature>> getXXXFeatures(final WiwsPortType port, 
final String accessionCode) {
    return new Callable<List<Feature>>() {
        @Override
        public List<Feature> call() throws Exception {
            List<Feature> features = new ArrayList<Feature>();
            //getXXXFeatures are methods of the WS Proxy
            //that can take anywhere from second to never to return
            for (RawFeature raw : port.getXXXFeatures(accessionCode)) {
                Feature ft = convertFeature(raw);
                features.add(ft);
            }
            if (Thread.currentThread().isInterrupted())
                log.error("XXX was interrupted");
            return features;
        }
    };
}

그리고 WS 호출을 동시에 시작하는 코드는 다음과 같습니다.

WiwsPortType port = new Wiws().getWiws();
List<Future<List<Feature>>> ftList = new ArrayList<Future<List<Feature>>>();
//Counting wrapper around CompletionService, 
    //so I could implement ccs.hasRemaining()
CountingCompletionService<List<Feature>> ccs = 
        new CountingCompletionService<List<Feature>>(threadpool);
ftList.add(ccs.submit(getXXXFeatures(port, accessionCode)));
ftList.add(ccs.submit(getYYYFeatures(port accessionCode)));
ftList.add(ccs.submit(getZZZFeatures(port, accessionCode)));

List<Feature> allFeatures = new ArrayList<Feature>();
while (ccs.hasRemaining()) {
            //Low for testing, eventually a little more lenient
    Future<List<Feature>> polled = ccs.poll(5, TimeUnit.SECONDS);
    if (polled != null)
        allFeatures.addAll(polled.get());
    else {
        //Still jobs remaining, but unresponsive: Cancel them all
        int jobsCanceled = 0;
        for (Future<List<Feature>> job : ftList)
            if (job.cancel(true))
                jobsCanceled++;
        log.error("Canceled {} feature jobs because they took too long",
                        jobsCanceled);
        break;
    }
}

이 코드에서 발생하는 문제는 port.getXXXFeatures(...)가 반환될 때까지 기다릴 때 Callable이 실제로 취소되지 않지만 어떻게든 계속 실행된다는 것입니다.에서 볼 수 있듯이 if (Thread.currentThread().isInterrupted()) log.error("XXX was interrupted"); 중단된 플래그를 설명합니다. ~이다 port.getFeatures가 반환된 후에 설정하면 취소를 호출할 때 중단되는 대신 Webservice 호출이 정상적으로 완료된 후에만 사용할 수 있습니다.

누구든지 내가 뭘 잘못하고 있는지, 그리고 주어진 기간 후에 실행 중인 CXF 웹 서비스 호출을 중지하고 이 정보를 내 애플리케이션에 등록할 수 있는 방법을 말해 줄 수 있습니까?

감사합니다, 팀

도움이 되었습니까?

해결책

편집 3 새로운 답변.

다음 옵션이 표시됩니다.

  • 기능 요청으로 Apache CXF에 문제를 게시하세요.
  • ACXF를 직접 수정하고 일부 기능을 공개하세요.
  • Apache CXF 내에서 비동기 WS 호출 지원 옵션을 찾아보세요.
  • 다른 WS 공급자(JAX-WS?)로 전환하는 것을 고려해보세요.
  • 서비스가 지원하는 경우 RESTful API를 사용하여 WS를 직접 호출하십시오(예:매개변수가 있는 일반 HTTP 요청)
  • uber 전문가에게만 해당:실제 스레드/스레드 그룹을 사용하고 비정통적인 방법으로 스레드를 종료하십시오.

다른 팁

CXF 문서에는 HTTPURLConnection에서 읽기 시간 제한을 설정하기 위한 몇 가지 지침이 있습니다.http://cwiki.apache.org/CXF20DOC/client-http-transport-포함-ssl-support.html

그것은 아마도 귀하의 요구를 충족시킬 것입니다.서버가 제 시간에 응답하지 않으면 예외가 발생하고 콜러블은 예외를 받게 됩니다.(대신 정지될 수 있는 버그가 있는 경우는 제외됩니다.2.2.2에서 수정되었는지 아니면 지금은 스냅샷에만 있는지 기억이 나지 않습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top