
Der Benutzeragent ist XML-WS Runtime 4.0.0.

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

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);
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.