Приостановка и уведомление определенных потоков в веб-сервисе Java - PullRequest
1 голос
/ 05 ноября 2011

Я пишу веб-сервис Java с CXF.У меня есть следующая проблема: клиент вызывает метод из веб-службы.Веб-сервис должен выполнять две вещи параллельно и запускает два потока.Один из потоков нуждается в дополнительной информации от клиента.Невозможно добавить эту информацию при вызове метода веб-службы, поскольку она зависит от расчетов, выполненных в веб-службе.Я не могу перепроектировать веб-сервис, потому что он является частью задания курса, и задания заявляют, что я должен сделать это таким образом.Я хочу приостановить поток и уведомить его, когда клиент предоставит дополнительную информацию.К сожалению, в Java невозможно уведомить конкретный поток.Я не могу найти другой способ решить мою проблему.

У кого-нибудь есть предложения?

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Я отредактировал свой ответ, подумав еще об этом .

У вас довольно сложная архитектура, и если ваш клиент запрашивает информацию с сервера, чтобы выполнить запрос, тоЯ думаю, что вам нужно опубликовать один или несколько «вспомогательных» методов.

Например, вы можете опубликовать (без всей аннотации веб-службы):

MyData validateMyData(MyData data);

boolean processMyData(MyData data);

Затем клиент будет вызывать validateMyData() столько раз, сколько ему хотелось, пока он не узнал, что располагает полной информацией.Сервер может изменять (с помощью вычислений, поиска в базе данных или чего-либо еще) переменные в MyData, чтобы помочь заполнить информацию и передать ее клиенту (для обновления пользовательского интерфейса, если таковой имеется).

Как только информация завершена, клиент может затем вызвать processMyData() для обработки полного запроса.

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

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

1 голос
/ 05 ноября 2011

IMO, довольно странно, что запрос веб-сервиса фактически не завершен. Почему запрос не может передать всю информацию за один раз? Я попытался бы перестроить ваш сервис таким образом, чтобы он не работал, если вы не передаете всю информацию, необходимую для обработки запроса.

РЕДАКТИРОВАТЬ: Хорошо, если у вас действительно есть , чтобы сделать это, я бы не стал создавать новый поток, когда вы получите первый запрос. Я бы сохранял информацию из первого запроса (будь то в базе данных или просто в памяти, если это просто фиктивный запрос), а затем, когда приходит запрос second , запускает поток.

...