Ожидание завершения асинхронного вызова, а затем продолжение в Java - PullRequest
2 голосов
/ 12 февраля 2011

У меня есть ситуация, когда я вызываю метод, который, в свою очередь, запускает асинхронный HTTP-вызов REST (отправляет состояние позже в другую конечную точку), прежде чем продолжить работу.Я хочу, чтобы метод ждал, пока я не получу ответ обратно к конечной точке, проверим статус, который я получил, и продолжу дальше.Я ищу выполнимое решение в Java.Любой псевдокод или реализация будет полезен

видел аналогичный случай @ Облегченный способ ожидания группы асинхронных вызовов Java , но не так много идей о том, легко ли его реализовать.

Подробности реализации

У меня есть конечная точка JAX-RS для обработки асинхронного ответа, как показано ниже

@POST
@Path("/status")
@Consumes("application/xml")
public Response processConfigStatus(@Context UriInfo uriInfo, ConfigStatus configStatus)
{
   // process Status got from the async REST call
   return ResponseHelper.createNoContentResponse();
}

Класс, который обрабатывает и обрабатывает

Class ProcessData{

  public void updateData()
    checktStatus(uri);
    update();// should wait untill the processConfigStatus() endpoint gives status
  }

  private  checktStatus(String uri){
     // makes a REST call to a URI using a JAX-RS webclient or a httpclient this returns HTTP 200 or 204 code immediatley. And then the Server process the request asynchronously and gives back the status to JAX-RS endpoint(/status).
     post(uri);
  }

}

вызов метода из другого класса

ProcessData pd = new ProcessData()
pd.updateData();

Ответы [ 2 ]

4 голосов
/ 18 сентября 2012

Как насчет использования CountDownLatch ?

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

0 голосов
/ 12 февраля 2011

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


count = numAsyncCalls
..calling all of the RESTful services here (each call must have some sort of callback to decrement 'count' variable above..
while (count > 0)
   wait around

Использование CountDownLatch в вашей ссылке выглядит почти так же, как мой псевдокод

...