Ich arbeite an einem WebService-Client und möchte ein Timeout für meinen WebService-Aufruf festlegen. Ich habe verschiedene Ansätze ausprobiert, kann dies aber immer noch nicht erreichen. Ich verwende JAX-WS für die Codegenerierung aus WSDL. Ich verwende JBoss-eap-5.1 als App Server und JDK1.6.0_27. Ich habe diese unterschiedlichen Methoden zum Festlegen des Timeouts gefunden, aber keine davon funktioniert für mich.
URL mbr_service_url = new URL(null,GlobalVars.MemberService_WSDL, new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL url) throws IOException {
URL clone_url = new URL(url.toString());
HttpURLConnection clone_urlconnection = (HttpURLConnection) clone_url.openConnection();
// TimeOut settings
clone_urlconnection.setConnectTimeout(10000);
clone_urlconnection.setReadTimeout(10000);
return (clone_urlconnection);
}
});
MemberService service = new MemberService(mbr_service_url);
MemberPortType soap = service.getMemberPort();
ObjectFactory factory = new ObjectFactory();
MemberEligibilityWithEnrollmentSourceRequest request = factory.createMemberEligibilityWithEnrollmentSourceRequest();
request.setMemberId(GlobalVars.MemberId);
request.setEligibilityDate(value);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.internal.ws.client.BindingProviderProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.internal.ws.client.BindingProviderProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.internal.ws.developer.JAXWSProperties.REQUEST_TIMEOUT, 10000);
((BindingProvider) soap).getRequestContext().put(com.Sun.xml.internal.ws.developer.JAXWSProperties.CONNECT_TIMEOUT, 10000);
System.setProperty("Sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("Sun.net.client.defaultReadTimeout", "10000");
MemberEligibilityWithEnrollmentSourceResponse response = soap.getMemberEligibilityWithEnrollmentSource(request);
logger.log("Call to member service finished.");
Im Moment habe ich meine Webservice-Methode von einem Executor aus aufgerufen. Ich weiß, es ist kein guter Ansatz, aber er funktioniert für mich. Leute, bitte helft mir dabei.
logger.log("Parameters set for createorUpdateContact call.\nGoing in Executor Service.");
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
@Override
public void run() {
try {
response = soap.getMemberEligibilityWithEnrollmentSource(request);
} catch (MemberServiceException ex) {
logger.log("Exception in call to WebService", ex.fillInStackTrace());
}
}
});
executorService.shutdown();
try {
executorService.awaitTermination(GlobalVars.WSCallTimeOut, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
logger.log("Thread Interrupted!", ex);
executorService.shutdownNow();
}
Sie können diese Einstellungen ausprobieren (sie sind gepaart, um paarweise verwendet zu werden).
BindingProviderProperties.REQUEST_TIMEOUT
BindingProviderProperties.CONNECT_TIMEOUT
BindingProviderProperties
sollte aus com.Sun.xml.internal.WS.client
stammen
Oder die Zeichenfolgen für JBoss :
javax.xml.ws.client.connectionTimeout
javax.xml.ws.client.receiveTimeout
Alle Eigenschaften müssen in Millisekunden auf getRequestContext()
gesetzt werden.
(BindingProvider)wsPort).getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, yourTimeoutInMillisec);
Für JBoss können Sie die Eigenschaft StubExt.PROPERTY_CLIENT_TIMEOUT
Aus org.jboss.ws.core.StubExt
Verwenden. Siehe dieser Thread für Details.
Wie Kolossus sagte, sollten Sie verwenden:
com.Sun.xml.internal.ws.client.BindingProviderProperties
Und String-Werte sind:
com.Sun.xml.internal.ws.connect.timeout
com.Sun.xml.internal.ws.request.timeout
Obwohl interne Pakete nicht verwendet werden sollten, ist dies der einzige Weg, wenn Sie mit Standard-JDK6 arbeiten. In diesem Fall sollte das Empfangs- und Verbindungs-Timeout folgendermaßen eingestellt werden:
bindingProvider.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT,requestTimeoutMs);
bindingProvider.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT,connectTimeoutMs);
Beachten Sie jedoch, dass konstante Werte unterschiedlich sind, wenn Sie eine andere JAXWS-Referenzimplementierung verwenden, d. H. JAXWS-RT 2.1.4 BindingProviderProperties:
com.Sun.xml.ws.client.BindingProviderProperties
sie haben unterschiedliche String-Werte für REQUEST_TIMEOUT und CONNECT_TIMEOUT:
com.Sun.xml.ws.request.timeout
com.Sun.xml.ws.connect.timeout
Für mich Einstellung javax.xml.ws.client.connectionTimeout
und javax.xml.ws.client.receiveTimeout
Problem gelöst.
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", timeout);
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", timeout);
siehe link
Das Einstellen der folgenden Optionen funktioniert für mich. Ich verwende die Implementierung von Metro JAXWS.
((BindingProvider)portType).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) portType).getRequestContext().put(JAXWSProperties.REQUEST_TIMEOUT, 50000);
portType ist die Webdienst-Endpunktschnittstelle.
Werte der obigen Felder aus com.Sun.xml.internal.ws.developer.JAXWSProperties
public static final Java.lang.String CONNECT_TIMEOUT = "com.Sun.xml.internal.ws.connect.timeout";
public static final Java.lang.String REQUEST_TIMEOUT = "com.Sun.xml.internal.ws.request.timeout";
Aktualisieren Sie die native Bibliothek von jbossws und verwenden Sie StubExt.PROPERTY_CLIENT_TIMEOUT
Um ein Upgrade von jbossws-native durchzuführen, folgen Sie diesem Link .
* jbossws-native-3.4.0 ist die neueste unterstützte Version für Jboss 5.1.0GA. Sie sehen JBossWS - Unterstützte Zielcontainer
Das hat bei mir funktioniert
Ich habe eine alte Installationslaufzeit mit dieser Umgebung: Jdk-1.5, Jboss-4.2.3.GA und der WSClient wurden mit der JAX-WS-Spezifikation 2.0 erstellt.
um das Soap Request Timeout zu aktivieren, benutze ich den folgenden Code ((BindingProvider)port).getRequestContext().put(org.jboss.ws.core.StubExt.PROPERTY_CLIENT_TIMEOUT, String.valueOf(readTimeout));
und das Glas jbossws-client.jar
kopiert in jboss-4.2.3.GA\server\default\lib\