2015-01-27 2 views
0

Я создаю REST API, который вызывает API-вызов в цикле. Что-то вроде этого:Результаты отслеживания обратных вызовов Async в Java

 @RequestMapping(value = "/sendmessages", method = RequestMethod.POST) 
      public ResponseEntity<String> sendMessage(ModelMap model, 
        HttpServletRequest req, HttpServletResponse res, 
        @RequestBody String requestBody) throws JSONException, 
        Exception { 

     JSONObject jsonObject = new JSONObject(requestBody); 
     JSONArray userIdArray = jsonObject.getJSONArray(ChatConstants.USER_IDS); 

     for (int i = 0; i < userIdArray.length(); ++i) { 

     pubnub.publish(SERVER, messageObject, new Callback() { 

         @Override 
         public void successCallback(String arg0, Object arg1) { 
          System.out.println(arg0); 
          System.out.println(arg1); 

         } 

         @Override 
         public void errorCallback(String arg0, PubnubError arg1) { 
          super.errorCallback(arg0, arg1); 

          System.out.println(arg0); 
          System.out.println(arg1); 
         } 
        }); 

     } 

    return new ResponseEntity<String>(HttpStatus.OK); 
} 

Я делаю PubNub вызов, который является вызовом Асинхронного и результат возвращается в обратном вызове. Я хочу вернуть выходные данные этих вызовов Async в моем вызове API. Любые идеи, как я могу отслеживать результат этих вызовов?

+0

попросите вызывающего абонента этого API передать вам объект обратного вызова, поэтому, как только вы закончите работу, вам просто нужно ответить обратно на вызывающего абонента, используя ваш успех и ошибку apis. – Techfist

ответ

1

Я бы предложил решение, основанное на двух методах. У вас уже есть sendMessage(), и вам нужен еще один checkMessageResult().

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

Каждый вызов сообщения отправки возвращает некоторый sentRequestId. Затем клиент проверяет время от времени запрос запроса, передающий sentRequestId. Когда вызывается обратный вызов, результат сохраняется на карте карты. Функция CheckMessageResult() просто возвращает содержимое с карты через sentRequestId.

+0

Спасибо. Было бы здорово, если бы вы могли поделиться некоторыми фрагментами/ссылками, показывающими этот шаблон. –

+0

К сожалению, у меня нет примера соответствия ( – StanislavL

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