JAX-WS SOAP-Client hält die TCP-Verbindung nicht aufrechtJava

Java-Forum
Guest
 JAX-WS SOAP-Client hält die TCP-Verbindung nicht aufrecht

Post by Guest »

Ich verwende JAX-WS 4.x. Wenn ich die SOAP-Aufrufe von meinem Client aus durchführe, stelle ich fest, dass die Clientseite die TCP-Verbindung nach einem festgelegten Timeout beendet. Ich kann die folgenden Header in meiner SOAP-HTTP-Anfrage sehen:
Image

Der Benutzeragent ist XML-WS Runtime 4.0.0.
Image

Beachten Sie im Bild oben, dass 100.64.0.1 der Client ist und das ist er auch FIN wird initiiert.
In einem separaten Testprojekt verwende ich spring-ws-core für den clientseitigen Code. Mein Client erweitert die WebServiceGatewaySupport-Klasse und ich erstelle die Bean wie folgt:

Code: Select all

@Bean
public CountryClient countryClient(Jaxb2Marshaller marshaller, HttpComponentsMessageSender messageSender) {
CountryClient client = new CountryClient();
client.setDefaultUri("http://localhost:8043/ws");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
client.getWebServiceTemplate().setMessageSender(messageSender);
return client;
}

@Bean
public HttpComponentsMessageSender httpComponentsMessageSender() {
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
messageSender.setConnectionTimeout(5 * 60 * 1000); // 5 minutes
messageSender.setReadTimeout(5 * 60 * 1000);       // 5 minutes
return messageSender;
}
Wenn ich jetzt mit diesem Spring-WS-basierten Client einen SOAP-Aufruf mache, sehe ich Folgendes:
Image

Der Benutzeragent wird in Apache-HttpClient geändert und die TCP-Verbindung wird vom nicht geschlossen Client-Seite.
Ich wollte sehen, ob ich denselben http-Client in JAX-WS verwenden kann, also habe ich den folgenden Vorschlag ausprobiert, der mir aber offenbar nicht funktioniert:

Code: Select all

        // None of the following timeout have any effect on keep-alive
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 5*60*1000);
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 5*60*1000);
bindingProvider.getRequestContext().put("javax.xml.ws.client.connectionTimeout", 5*60*1000);
bindingProvider.getRequestContext().put("javax.xml.ws.client.receiveTimeout", 5*60*1000);

// Add HTTP client transport settings
CloseableHttpClient httpClient = createHttpClient();

// Use Apache HttpClient for requests
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
messageSender.setConnectionTimeout(5 * 60 * 1000); // 5 minutes
messageSender.setReadTimeout(5 * 60 * 1000);       // 5 minutes
messageSender.setHttpClient(httpClient);

// Assign the message sender to the BindingProvider
bindingProvider.getRequestContext().put("com.sun.xml.ws.transport.http.client.HttpTransportPipe.messageSender", messageSender);
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.messageSender", messageSender);
Mein Hauptproblem besteht darin, dass der Client keine Auswirkungen auf das Keep-Alive-Flag und das Keep-Alive-Timeout hat, wenn der Benutzeragent XML-WS Runtime 4.0.0 ist. Es initiiert automatisch einen FIN nach einem Timeout-Wert, der scheinbar der Standardwert der Serverseite ist, dem Client jedoch nie mitgeteilt wird. Ich weiß das, weil ich in den Headern der vom Server gesendeten Antwort keine Zeitüberschreitungen oder Keep-Alive-Einstellungen sehe.
Allerdings, wenn der Benutzeragent Apache-HttpClient ist< /code>, das Keep-Alive-Flag und das vom Client festgelegte Timeout, wird berücksichtigt und die TCP-Verbindung bleibt offen, anstatt vom Client geschlossen zu werden.
Auf der Serverseite I Ich weiß, dass ich das Keep-Alive des Servers einstellen kann Timeout und das scheint zu funktionieren, aber im realen Szenario habe ich keine Kontrolle über den Server. Stattdessen möchte ich, dass sich JAX-WS ähnlich wie Apache-HttpClient verhält.
Frage Wie kann ich den Benutzeragenten von JAX-WS in Apache-HttpClient< ändern? /code> oder wie kann ich JAX-WS dazu bringen, die TCP-Verbindung vom Client nicht zu schließen? Ich möchte nur Lösungen, die auf der Clientseite und nicht auf der Serverseite funktionieren.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post