2016-10-28 6 views
1

Я пишу многопоточный сервер, с которым нужно обрабатывать клиентские запросы и возвращать их обратно клиенту по завершении.Параллельность: Подождите, пока не будет выполнен общий код кода

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

Проблема заключается в том, что я понятия не имею, как уведомить клиента о завершении обработки сервера.

Это поток, который обрабатывает клиентскую полезную нагрузку, полезная нагрузка является BlockingQueue, который ранее был загружен клиентскими потоками:

Thread messageHandling = new Thread() { 
     public void run(){ 
      while(true){ 
       try{ 
        Object payLoad= payLoads.take(); 
        // Do some handling       
        // SEND REPLY BACCK TO THE CLIENT 
       } 
       catch(InterruptedException e){ } 
      } 
     } 
    }; 

В то же время, на стороне клиента, то происходит следующее:

{ 
    ... 
payloads.add(payLoad) 
/// Sleep until the server is done doing its logic with the payload 

}

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

Я потратил много времени на исследование, посмотрел на проблему потребителя/производителя, механизм ожидания/уведомления и т. Д., Но ничто не похоже на эту конкретную проблему.

Любая помощь была бы принята с благодарностью.

+0

* «но ничто не похоже на эту конкретную проблему». * В соответствии с моим пониманием у вас есть экземпляр (сервер), который хранит задания и собирает результаты, в то время как многие клиенты тянут доступные задания и должны сообщать результаты , правильно? –

+0

Правильно – Dragan

+0

ОК, тогда вам нужно 2 метода в вашем объекте «диспетчер», метод 'take()', ваш код уже имеет и метод для возврата результатов, таких как 'report (JobResult jr)'. Клиенты получают работу, как у вас уже есть.когда они заканчивают, они сообщают о своем результате, и объект «диспетчер» должен соответствовать результатам с заданиями и делать то, что когда-либо он должен делать с результатом. –

ответ

1

Вам необходимо сохранить информацию о подключении клиента рядом с полезной нагрузкой в ​​вашем payloads.

Создать класс с двумя полями. Один из них будет вашей полезной нагрузкой, а другой - тем, что позволяет вам идентифицировать своего клиента.

В вашем // SEND REPLY BACCK TO THE CLIENT просто отправьте ответ. Нет необходимости ждать в /// Sleep until the server is done doing its logic with the payload

Не зная, с каким способом вы общаетесь с клиентом, я не могу дать вам лучший ответ.

В случае использования сокетов «что-то, что позволяет вам идентифицировать клиента» будет являться экземпляром сокета.

Другой подход будет использовать SynchronousQueue.

В // SEND REPLY BACCK TO THE CLIENT вы положили в него свой ответ.

В ответе /// Sleep until the server is done doing its logic with the payload вы принимаете ответ (метод блокируется до тех пор, пока ответ не будет помещен в буфер).

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

+0

Спасибо, это имеет смысл. Итак, в этом случае у меня не должно быть ожидающей части в клиентском потоке, и сокет должен быть написан и закрыт из метода сервера после завершения его работы? – Dragan

+0

Да. Первый подход лучше, потому что он не блокирует чтение потока. – talex

Смежные вопросы