Java: очередь с задержкой по времени - PullRequest
6 голосов
/ 29 мая 2011

Всем,

У меня есть система (источник), которая должна асинхронно уведомлять другую систему (цель) при изменении определенных объектов.Суть в том, что исходная система может мутировать один объект много раз за короткий промежуток времени (обновления являются очень «бурными»), и в этом случае было бы идеально, чтобы уведомить целевую систему только один раз и с окончательным состояниемobject.

Я думал, что для этого нужно использовать некую задержанную по времени очередь с дедупликацией перед ThreadPoolExecutor.Эта очередь будет:

  1. хранить элементы в очереди в течение минимального промежутка времени (в идеальном случае она должна быть просто smidgin дольше, чем продолжительность типичного всплеска мутаций)

  2. заменяет существующий объект в случае, если дубликат (как определено идентификатором объекта) ставится в очередь.Тем не менее, элемент должен сохранять свое первоначальное место в очереди (чтобы избежать перетаскивания какого-либо одного элемента в конец очереди - в какой-то момент нам нужно просто отправить уведомление, даже если другой моментально появится).

Я не видел ничего подобного в java.util, и мой google-fu в этой области выглядит особенно слабым.

Кто-нибудь реализовал этораньше, знаете реализацию BlockingQueue, которая ведет себя таким образом, или посоветуйте, как мне ее реализовать?

Заранее спасибо!

Питер

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

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

Я думаю, что вам лучше всего расширить ArrayBlockingQueue и переопределить offer и poll, чтобы добавить функцию задержки.В частности, ArrayBlockingQueue, потому что у него есть метод contains.

Другая идея - это DelayQueue, где вы переопределяете offer, чтобы удалить старый элемент и вставить новый, но сохранить старую задержку времени, которая будетпо сути сохранить порядок.Затем вам нужно обернуть элементы очереди в интерфейс Delayed.

0 голосов
/ 29 мая 2011

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

...