Тайм-аут чтения на веб-сервисе, но операция все еще завершается? - PullRequest
3 голосов
/ 31 августа 2011

У меня есть клиент веб-службы Java, работающий в Linux (с использованием Axis 1.4), который вызывает серию операций веб-служб, выполняемых на сервере Windows. В некоторых случаях некоторые транзакционные операции завершаются с ошибкой:

java.net.SocketTimeoutException: Read timed out

Однако операция на сервере завершена (даже при отсутствии полезного ответа на клиенте). Это ошибка сервера / клиента веб-службы? Или ожидается, что произойдет на сокете TCP?

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

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

Вы можете увеличить время ожидания соединения - если вы вручную управляете самим сокетом, метод socket.connect () может занять время ожидания (в миллисекундах). Ноль должен избегать тайм-аута вашей стороны - см. Документацию по API.

Если в каждом случае операция будет занимать много времени, вы можете захотеть сделать это асинхронным - первый запрос отправляет операции, затем второй запрос возвращает результаты, возможно, с некоторым опросом, чтобы увидеть когда результаты будут готовы.

Если вы считаете, что операция должна завершиться в это время, есть ли у вас доступ к серверу, чтобы узнать, почему он занимает так много времени?

0 голосов
/ 30 апреля 2018

У меня была похожая проблема. У нас есть мыльный веб-сервис JAX-WS, работающий на Jboss EAP6 (или JBOSS 7). Время ожидания сокета http по умолчанию установлено равным 60 секундам, если иное не отменено сервером или клиентом. Чтобы исправить эту проблему, я изменил наш Java-клиент на что-то вроде этого. Мне пришлось использовать 3 различные комбинации свойств здесь

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

//Set timeout on the client
String edxWsUrl ="http://www.example.com/service?wsdl";

URL WsURL = new URL(edxWsUrl);
EdxWebServiceImplService  edxService = new EdxWebServiceImplService(WsURL);
EdxWebServiceImpl edxServicePort = edxService.getEdxWebServiceImplPort();
//Set timeout on the client
BindingProvider edxWebserviceBindingProvider  = (BindingProvider)edxServicePort;
BindingProvider edxWebserviceBindingProvider  = (BindingProvider)edxServicePort;

edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", connectionTimeoutInMilliSeconds);
edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", connectionTimeoutInMilliSeconds);

edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.ws.request.timeout", connectionTimeoutInMilliSeconds);
edxWebserviceBindingProvider.getRequestContext().put("com.sun.xml.ws.connect.timeout", connectionTimeoutInMilliSeconds);

edxWebserviceBindingProvider.getRequestContext().put("javax.xml.ws.client.receiveTimeout", connectionTimeoutInMilliSeconds);
edxWebserviceBindingProvider.getRequestContext().put("javax.xml.ws.client.connectionTimeout", connectionTimeoutInMilliSeconds);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...