Axis2, используя Thread.sleep для блокировки

В настоящее время я кодирую Java WebService, используя axis2. Однако один конкретный запрос требует, чтобы я постоянно опрашивал статус на другом сервере в течение примерно 3-10 секунд.

Я хочу использовать Thread.sleep для опроса каждые 500 миллисекунд в течение 3 секунд. Имеет ли это какие-либо последствия, такие как проблема с производительностью, или кто-нибудь может предложить лучшую идею?

РЕДАКТИРОВАТЬ Моя архитектура такая

Клиент ‹---> axis2 ‹---> опрос сервера в течение 3-10 секунд


person henry    schedule 02.07.2010    source источник


Ответы (2)


Существует несколько различных вариантов:

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

Таким образом, у вас будет два веб-сервиса, один для инициализации запроса, второй для получения результата. Клиент (не осевой сервер) будет вызывать первую веб-службу, а затем вторую, возможно, несколько раз.

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

Если вы в конечном итоге засыпаете на своем сервере, убедитесь, что у вас достаточно потоков, если вы используете Tomcat, см. Рекомендации по настройке Apache/Tomcat

person Matthew Farwell    schedule 02.07.2010
comment
Является ли thread.sleep злой практикой, если я придерживаюсь схемы сна? - person henry; 04.07.2010
comment
В общем, считается плохой практикой делать сны на веб-серверах, если вы можете этого избежать, потому что это связывает поток, но я не вижу в этом никаких реальных проблем. Если бы вы выполняли чтение с блокировкой, вы бы ждали, это то же самое. - person Matthew Farwell; 04.07.2010
comment
Понятно. Спасибо. Запрос будет очень редким. - person henry; 08.07.2010

Другой шаблон состоит в том, чтобы первоначальный вызывающий объект возвращался с флагом Received_ok, а затем сохранял результаты на вашем сервере, когда они возвращаются со второго сервера. Затем первый сервер снова подключится, и тогда вы сможете либо вернуть результаты, либо тот факт, что они еще не вернулись. Преимущество этого заключается в том, что вы можете делегировать опрос другому экземпляру и не связывать исходный сервер.

person Romain Hippeau    schedule 02.07.2010
comment
Я не совсем понимаю. Не могли бы вы объяснить немного подробнее? Пс. Я отредактировал свой вопрос. - person henry; 02.07.2010
comment
Должен ли вызов быть синхронным? Если клиент не публикует информацию, полученную сервером, сервер делает свое дело и сохраняет данные. Позже клиент повторно подключается и получает данные. - person Romain Hippeau; 02.07.2010
comment
да. Он должен быть синхронным, чтобы он был прозрачным для пользователей/клиентов, которые меня подключают. Ваше предложение тоже приходит мне в голову. Но я бы предпочел разовое отключение связи. :) Просто я не уверен, правильно ли я подхожу к этому. - person henry; 04.07.2010