Нужно реализовать хитрую конкурентную структуру данных. Название даже еще не придумал :). Интерфейс сходен с блокирующей очередью: неблокирующий метод put, блокирующий метод take(). Очередь работает как временное окно, которое содержит уникальный set элементов, а метод take() возвращяет каждый элемент не чаще, чем раз в T миллисекунд. Элементы проверяются на равенство стандартно, через equals. То есть для всего входного потока сообщений, есть подпоследовательность элементов внутри которого все элементы equals. А на выходе мы хотим полить эту последовательность, получая апдейт элемента не чаще, чем раз в T. Когда мы первый раз делаем take() элементы возвращяются сразу, в FIFO порядке, затем последующий апдейт по мере поступления в очередь, но не чаще, чем раз в T.
Дополнительные плюшки: нужно иметь возможность перезапросить апдейт (неблокирующий метод get), который так же записывает последнее время использования элемента, еще нужна возможность вернуть элемент в очередь (не смогли обработать).
У меня есть страшненький прототип этой штуки. Не надеюсь, что кто-то будет продумывать весь этот гемор за меня, но вдруг делал что-то похожее.