Java callback ад с неопределенным количеством шагов - PullRequest
0 голосов
/ 06 сентября 2018

Мне нужно получать сообщения от службы за заданный интервал.

Я делаю запрос в свой сервис, где я указываю ОТ ОТ и ДО даты. Но служба запускается с даты ОТ и отправляет до 2000 сообщений, а затем возвращает мне эти 2000 сообщений, не более, даже если дата ТО не достигнута.

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

Скажем, метод выглядит следующим образом:

public void getMessages(Date from, Date to, Callback<List<Message>> onSuccess);

Итак, я попытался написать это так:

List<Message> allMessages = new ArrayList<>();
getMessages(fromDate, toDate, messages -> {
   //save all the messages returned
   allMessages.addAll(messages);
   if(messages.size()==2000){
      //get the last message date
      Date nextDate = messages.get(messages.size() - 1).getDateTime();
      //query next messages
      getMessages(nextDate, to, onSuccess); //and here I am screwed in what to put in the onSuccess again...
   }
});

Как это сделать, чтобы он продолжал определенное количество шагов или остановился, когда он наконец достигнет даты TO? Я даже могу изменить метод getMessages (), но я получаю данные из HTTP-запроса, поэтому это необходимо сделать с помощью Callback.

UPDATE: Спасибо за все ответы, на основе которых я нашел простое решение.

Я создал такой метод:

private void checkMessages(List<Message> messages, Date toDate, List<Message> allMessages) {
    // save all the messages returned
    allMessages.addAll(messages);
    if (messages.size() == 2000) {
      // get the last message date
      Date nextDate = messages.get(messages.size() - 1).getDateTime();
      // query next messages
      getMessages(nextDate, toDate,
          msgs -> checkMessages(msgs, toDate, allMessages));
    } else {
      // else we are finished
      messageTable.setMessages(allMessages);
    }
  }

и я использовал этот метод в обратном вызове:

List<Message> allMessages = new ArrayList<>();
getMessages(fromDate, toDate,
        messages -> checkMessages(messages, toDate, allMessages));

Это определенно не идеально, но, похоже, работает.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вместо обратного вызова у вас может быть Predicate, с помощью которого вы будете решать, нужно ли вам сделать еще один вызов.

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

public void getMessages(Date from, Date to, Predicate<List<Message>> shouldMakeAnotherCall) {
    new Thread(() -> {
        List<Message> messages = //Call service
        if (shouldMakeAnotherCall.apply(messages)) {
            getMessages(from, to, shouldMakeAnotherCall);
        }   
    }).start();
}

Predicate<List<Message>> shouldMakeAnotherCall = listOfMessages -> listOfMessages.size() == 2000;

getMessages(from, to, shouldMakeAnotherCall);

1 Это делает последующие вызовы, где каждый создает новыйНить и так не велика.

0 голосов
/ 06 сентября 2018

Как насчет этого?

    List<Message> allMessages = new ArrayList<>();
    Callback<List<Message>> onSuccessCallback = messages -> {
           //save all the messages returned
           allMessages.addAll(messages);
           if(messages.size()==2000){
              //get the last message date
              Date nextDate = messages.get(messages.size() - 1).getDateTime();
              //query next messages
              getMessages(nextDate, toDate, onSuccessCallback);
           }
    };
    getMessages(fromDate, toDate, onSuccessCallback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...