web-dev-qa-db-fra.com

Comment définir le délai d'expiration pour l'appel JAX-WS WebService

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();
        }
17
Sandeep Poonia

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.

22
kolossus

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
7
user2310395

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

5
Eqbal Murad

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";
3
Kishore Guruswamy

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

3
mariami

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\

0
Antonio Romano