JAXWS - требуется помощь для установки тайм-аута запроса WSDL - PullRequest
5 голосов
/ 08 декабря 2010

Я использую Metro 2.0 и J2SE5.Написанное мной приложение не знает о внешнем WebService во время компиляции, оно находит их во время выполнения на основе XML-файла бизнес-логики, поэтому я выполняю WSDL-запрос.

Пример кода, который я написал, выглядит какследующим образом:

String wsdlServiceName = ...; String wsdlURL = ...; Document payload = ...;</p> <pre><code>final String nsURI = ...; final QName serviceName = new QName(nsURI, wsdlServiceName + "Service"); final QName servicePort = new QName(nsURI, wsdlServiceName + "Port"); // Create service and the dispatcher for the SOAP message Service service = Service.create(new URL(wsdlURL), serviceName); dispatch = service.createDispatch(servicePort, SOAPMessage.class, Service.Mode.MESSAGE); // Set timeouts dispatch.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 3000); dispatch.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 3000); // Create the outgoing SOAP request SOAPBinding soapBinding = (SOAPBinding) dispatch.getBinding(); request = soapBinding.getMessageFactory().createMessage(); SOAPBody requestBody = request.getSOAPBody(); requestBody.addDocument(payload); // Invoke web service operation SOAPMessage response = dispatch.invoke(request);

Тайм-аут работает правильно при вызове веб-службы (dispatcher.invoke (запрос))

ОДНАКО WSDL запрашивается до того, как установлены тайм-ауты, и если веб-служба не отвечает, потребуется 90 секунд до истечения времени ожидания соединения.

Возможно лиустановить таймауты до запроса WSDL?Вам нужен диспетчер для установки времени ожидания, но это делается ПОСЛЕ создания службы, которая запрашивает WSDL ?!(т.е. Service.create ())

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Мы только что столкнулись с этой же проблемой и перепробовали все настройки, упомянутые выше - также безрезультатно.

Нашим решением было сначала загрузить WSDL во временный файл, используя URL.openConnection () (устанавливая тайм-ауты для соединения с: URLConnection.setConnectionTimeout () и URLConnection.setReadTimeout ()).Затем мы генерируем URL для этого файла с помощью: File.toURI (). ToURL (), который мы передаем конструктору службы, который получает URL.

Этот подход позволяет динамически извлекать текущий WSDL, в то время как явноконтроль времени ожидания.Затем мы устанавливаем таймаут для последующих звонков в службу, как показано в исходном сообщении.

2 голосов
/ 08 декабря 2010

Попробуйте установить системное свойство

sun.net.client.defaultConnectTimeout 

, но из Свойства сети говорится, что оно может не поддерживаться в будущих выпусках

Однако я бы предложил кэшироватьWSDL, а не удаленный доступ к нему.
Лучше с точки зрения производительности, особенно если вы работаете с WSDL, который, как ожидается, не будет часто меняться.

...