Frage

Bearbeiten

Diese Frage ist jetzt durch ein paar Iterationen gegangen, so fühlen sich frei durch die Revisionen zu sehen einige Hintergrundinformationen über die Geschichte und Dinge ausprobiert, um zu sehen.


Ich bin ein CompletionService zusammen mit einem ExecutorService verwenden und eine aufrufbare, um gleichzeitig rufen die eine Reihe von Funktionen auf ein paar verschiedenen Webdiensten durch CXF Code generiert .. Diese Dienste tragen alle verschiedene Informationen auf einem einzigen Satz von Informationen I‘ m für mein Projekt verwenden. Die Dienste können jedoch nicht über einen längeren Zeitraum zu reagieren, ohne eine Ausnahme zu werfen, die Verlängerung der Wartezeit auf den kombinierten Satz von Informationen.

Um dies zu begegnen Ich bin mit all den Service gleichzeitig aufruft, und nach ein paar Minuten möchte eine der Gespräche beenden, die noch nicht abgeschlossen haben, und vorzugsweise einzuloggen, welche davon nicht fertig waren noch entweder von innerhalb des aufrufbar oder durch eine detaillierte Exception zu werfen.

Hier ist ein stark vereinfachter Code zu veranschaulichen, was ich tue schon:

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;
        }
    };
}

Und der Code, der gleichzeitig startet die WS aufruft:

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;
    }
}

Das Problem, das ich mit diesem Code habe, ist, dass die Callables sind nicht wirklich gelöscht, wenn für port.getXXXFeatures (...) warten zurückzukehren, aber irgendwie weiterlaufen. Wie Sie aus den if (Thread.currentThread().isInterrupted()) log.error("XXX was interrupted"); Aussagen die unterbrochene Flagge sehen ist nach port.getFeatures kehrt zurück, dies ist nur verfügbar, nachdem der Webservice Aufruf normalerweise abgeschlossen ist, statt es unterbrochen wurde, als ich Abbrechen genannt.

Kann mir jemand sagen, was ich tue falsch und wie kann ich den Lauf CXF Webservice Anruf nach einer bestimmten Zeitperiode stoppen, und registrieren Sie diese Informationen in meiner Anwendung?

Mit freundlichen Grüßen, Tim

War es hilfreich?

Lösung

Bearbeiten 3 Neue Antwort.

Ich sehe diese Optionen:

  • Senden Sie Ihr Problem auf der Apache CXF als Feature-Request
  • Fix ACXF sich selbst und einige Funktionen aus.
  • Suchen Sie nach Optionen für asynchrone WS Aufruf Unterstützung innerhalb des Apache CXF
  • Betrachten Sie zu einem anderen WS-Provider Schalt (JAX-WS?)
  • Sie Ihre WS nennen sich RESTful API zu verwenden, wenn der Dienst unterstützt (z Plain-HTTP-Anfrage mit Parametern)
  • Für über Experten nur:. Wahr Fäden / Thread-Gruppe verwenden, und die Fäden mit unorthodoxen Methoden töten

Andere Tipps

Die CXF docs haben einige Anweisungen für die auf der HttpURLConnection die Lese Timeout Einstellung: http://cwiki.apache.org/CXF20DOC/ Client-http-Transport-inklusive-ssl-support.html

Das wäre wahrscheinlich Ihre Bedürfnisse erfüllen. Wenn der Server nicht rechtzeitig reagiert, wird eine Ausnahme ausgelöst und die abrufbaren würde die Ausnahme erhalten. (Außer es ist ein Fehler ist, wo stattdessen hängen ist. Ich kann mich nicht erinnern, ob die für 2.2.2 festgelegt wurde oder wenn es nur in den Schnappschüssen jetzt.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top