webentwicklung-frage-antwort-db.com.de

So legen Sie das Zeitlimit für den JAX-WS-WebService-Aufruf fest

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

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.

22
kolossus

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

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

5
Eqbal Murad

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

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

3
mariami

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\

0
Antonio Romano