Je travaille sur un client WebService et je veux définir un délai d'expiration pour mon appel WebService. J'ai essayé différentes approches, mais je n'y parviens toujours pas. J'utilise JAX-WS pour la génération de code à partir de WSDL. J'utilise JBoss-eap-5.1 comme serveur d'applications et JDK1.6.0_27. J'ai trouvé ces approches diff pour définir le délai d'expiration, mais aucune ne fonctionne pour moi.
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.");
Pour l'instant, ce que j'ai fait, c'est que j'ai appelé ma méthode webservice depuis l'intérieur d'un exécuteur. Je sais que ce n'est pas une bonne approche, mais ça marche pour moi. Les gars, aidez-moi à le faire correctement.
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();
}
Vous pouvez essayer ces paramètres (ils sont jumelés pour être utilisés par paires)
BindingProviderProperties.REQUEST_TIMEOUT
BindingProviderProperties.CONNECT_TIMEOUT
BindingProviderProperties
doit provenir de com.Sun.xml.internal.WS.client
Ou les chaînes pour JBoss :
javax.xml.ws.client.connectionTimeout
javax.xml.ws.client.receiveTimeout
Toutes les propriétés à mettre sur getRequestContext()
en millisecondes.
(BindingProvider)wsPort).getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT, yourTimeoutInMillisec);
Pour JBoss en particulier, vous souhaiterez peut-être utiliser la propriété StubExt.PROPERTY_CLIENT_TIMEOUT
De org.jboss.ws.core.StubExt
. Voir ce fil pour plus de détails.
Comme l'a dit kolossus, vous devez utiliser:
com.Sun.xml.internal.ws.client.BindingProviderProperties
Et les valeurs de chaîne sont:
com.Sun.xml.internal.ws.connect.timeout
com.Sun.xml.internal.ws.request.timeout
Bien que les packages internes ne doivent pas être utilisés, c'est le seul moyen si vous travaillez avec JDK6 par défaut. Ainsi, dans ce cas, le délai d'attente de réception et de connexion doit être défini avec:
bindingProvider.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT,requestTimeoutMs);
bindingProvider.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT,connectTimeoutMs);
Mais attention, les valeurs constantes sont différentes si vous utilisez une autre implémentation de référence JAXWS, c'est-à-dire JAXWS-RT 2.1.4 BindingProviderProperties:
com.Sun.xml.ws.client.BindingProviderProperties
vous aurez différentes valeurs de chaîne pour REQUEST_TIMEOUT et CONNECT_TIMEOUT:
com.Sun.xml.ws.request.timeout
com.Sun.xml.ws.connect.timeout
Pour moi, mettre javax.xml.ws.client.connectionTimeout
et javax.xml.ws.client.receiveTimeout
résolu le problème.
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", timeout);
((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", timeout);
se référer lien
La définition des options suivantes fonctionne pour moi. J'utilise l'implémentation Metro JAXWS.
((BindingProvider)portType).getRequestContext().put(JAXWSProperties.CONNECT_TIMEOUT, 10000);
((BindingProvider) portType).getRequestContext().put(JAXWSProperties.REQUEST_TIMEOUT, 50000);
portType est l'interface du point de terminaison du service Web.
Valeurs des champs ci-dessus de 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";
Mettez à niveau la bibliothèque native de jbossws et utilisez StubExt.PROPERTY_CLIENT_TIMEOUT
Pour mettre à jour jbossws-native, suivez ceci lien .
* jbossws-native-3.4.0 est la dernière version prise en charge pour Jboss 5.1.0GA. Vous pouvez voir JBossWS - Conteneurs cibles pris en charge
Cela a fonctionné pour moi
J'ai un ancien runtime d'installation qui a cet environnement: Jdk-1.5, Jboss-4.2.3.GA et le WSClient a été créé par la spécification JAX-WS 2.0.
pour activer le délai de demande de savon, j'utilise le code suivant ((BindingProvider)port).getRequestContext().put(org.jboss.ws.core.StubExt.PROPERTY_CLIENT_TIMEOUT, String.valueOf(readTimeout));
et le pot jbossws-client.jar
copié dans jboss-4.2.3.GA\server\default\lib\