2016-08-08 29 views
0

Ich habe einen CXF-Dienst generiert und stellen Sie Timeouts für 120000ms = 2min für beide:Einrichten eines Client ReceiveTimeout für CXF Service über 4 Minuten

requestContext.put("javax.xml.ws.client.receiveTimeout", 120000); 
requestContext.put("javax.xml.ws.client.connectionTimeout", 120000); 

Es funktioniert gut, ich habe es für 20s, 1min, 3min getestet - jedes Mal wenn es wartet für die Antwort genau das ist Zeit.

Problem erscheint jedoch, wenn ich es auf 5min setzen wollte. Der Service wartet nur auf ~240800ms = ~4min.

Ich rufe jboss esb service. Dieser dauert maximal 5min. Der CXF-Dienst wird von der einfachen .jar Anwendung von meinem PC aus aufgerufen, so dass keine anderen Server/Container zwischen (wie Tomcat usw.) vorhanden sind.

Irgendwelche Ideen, um meine Timeout-Einstellungen zu beheben?

ein EDIT Apache CXF 3.0.1

Mit

Was jetzt wird mir klar, dass ich immer 2 diffrent Nachrichten auf meinen Timeout-Einstellungen abhängig:

  • Wenn ich es <=4min gesetzt (über meine oder @ pedrofb Methode), nach dieser Zeit bekomme ich:

    org.apache.cxf.interceptor.Fault: Nachricht konnte nicht gesendet werden. bei org.apache.cxf.interceptor.MessageSenderInterceptor $ MessageSenderEndingInterceptor.handleMessage (MessageSenderInterceptor.java:64) bei org.apache.cxf.phase.PhaseInterceptorChain.doIntercept (PhaseInterceptorChain.java:307) bei org.apache.cxf. endpoint.ClientImpl.doInvoke (ClientImpl.java:516)

    verursacht durch: java.net.SocketTimeoutException: SocketTimeoutException http://esb:8080/MyService/ebws/Category/MyService Aufruf: Read timed out

  • wenn ich es >4min oder 0 gesetzt, ich bin immer :

    javax.xml.ws.s oap.SOAPFaultException: Es wurde keine Antwort für den Dienst empfangen [Kategorie: MeinService], Wird nicht wiederholt.

Um ehrlich zu sein, ich bin ziemlich verwirrt, was ein erwartetes Ergebnis ist (erste, glaube ich)

EDIT 2

I MyService über SoapUI getestet haben. Ich habe dort eine 5min Timeout gesetzt und mit Probeanforderung schießen.

Wieder nach etwas mehr als 4 min Ich erhalte eine:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
<env:Header/> 
<env:Body> 
    <env:Fault> 
    <faultcode>env:Server</faultcode> 
    <faultstring>No response received for service [Category:MyService], Told not to retry.</faultstring> 
    </env:Fault> 
</env:Body> 
</env:Envelope> 

Allerdings, wenn ich log schauen Sie in der Jboss ESB habe ich keine Ausnahmen, keine Fehler, MyService zuletzt ein 1 min mehr (ca. 5 Minuten) und normale Antwort zurückgeben - was durch Audit-Tool bestätigt wird (die jede Anfrage an mein esb registrieren - mit Antwort und Zeit).

Ich denke, dass dieser Punkt darauf, was @pedrofb in Kommentar erwähnt. Irgendwelche Vorschläge, was das sein kann?

+0

Kann der Server die Antwort auf vier Minuten begrenzen? – pedrofb

+0

Ich habe überprüft, dass - Service reagiert nach etwa 4,5min mit normalen, erwarteten Nachricht, Server-Timeout ist auf 5 min festgelegt, die bestätigt, dass – ilovkatie

+1

Vielleicht ist Ihr Problem ähnlich zu diesem http: //rayploski.blogspot. com.es/2010/08/jbossbs-setting-up-long-running.html Der Client erhält eine Zeitüberschreitung, während der ESB die Verarbeitung fortsetzt. In diesem Fall ist es notwendig, 'org.jboss.soa.esb.ws.timeout' in ESB – pedrofb

Antwort

1

Vielleicht ähnelt Ihr Problem diesem http://rayploski.blogspot.com.es/2010/08/jbossesb-setting-up-long-running.html Der Client empfängt ein Timeout, während der ESB die Verarbeitung fortsetzt. In diesem Fall ist es erforderlich, org.jboss.soa.esb.ws.timeout in ESB

zu konfigurieren, Client-Timeout zu verwenden scheint requestContext Parameter sind nicht standardisiert siehe https://java.net/jira/browse/JAX_WS-1166. CXF Team schlagen sie

Versuchen Sie es mit CXF spezifischen Parameter für Timeout

ändern
Client client = ClientProxy.getClient(proxy); 
HTTPConduit http = (HTTPConduit) client.getConduit(); 
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setConnectionTimeout(0); 
httpClientPolicy.setReceiveTimeout(0); 
http.setClient(httpClientPolicy); 

Die vollständige Liste der Parameter here ist. 0 bedeutet keine Zeitüberschreitung.