Узнать ход асинхронных процессов всегда сложно, особенно если вы не знаете, запущены ли они на самом деле.
Лучший способ, который я нашел, - написать другую функцию, которая просто получаетпрогресс, поэтому, если у вас есть уникальный идентификатор для каждого вызова, то обновите hashmap
текущим процессом.Вы можете посмотреть на Concurrent Hashmap (http://download -llnw.oracle.com / javase / 1.5.0 / docs / api / java / util / concurrent / ConcurrentHashMap.html )
Тогда эта другая функция поиска просто возьмет уникальный идентификатор и вернет прогресс обратно клиенту.
Если он не был запущен, вы также можете вернуть его, и в идеале вы можете захотеть также вернуть любые сообщения об ошибках, которые возникли при обработке.
Затем, когдаоно завершилось, и вы вернули сообщение об ошибке или об успехе, а затем удалили его из хэш-карты, клиент получил информацию, и эта информация не изменится, поэтому нет смысла держать ее в курсе.
ОБНОВЛЕНИЕ:
В вашем интерфейсе создайте новую функцию
String progressDone(String id);
Затем вы будете обращаться к ней синхронно, так как она просто выходит и возвращается обратно, чтобы она могла выглядетьувеличьте значение id
в hashmap
и верните либо процент выполненных работ, либо сообщение об ошибке.
Но это означает, что вашей фактически работающей функции нужно очень часто помещать информацию в хэш-карту относительно ее местоположения.Вот почему я предложил использовать параллельную хэш-карту, чтобы вам не приходилось беспокоиться о одновременных записях и соображениях блокировки.