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

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

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

String wsdlServiceName = ...; String wsdlURL = ...; Document payload = ...;

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 ответа

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

sun.net.client.defaultConnectTimeout 

но из Networking Properties говорится, что он может не поддерживаться в будущих версиях

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

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

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

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

Другие вопросы по тегам