Коллеги, привет!
https://github.com/devromik/suspender
Небольшая библиотека на Java, позволяющая:
откладывать произвольные объекты на определённое время, используя путь (строка вида /segment_1/segment_2/…/segment_N) в качестве ключа
получать оповещения о восстановлении объектов
восстанавливать объекты, отложенные по префиксу, до истечения времени откладывания. Префикс — путь, состоящий из нескольких первых сегментов другого пути, расположенных в том же порядке. Объекты, отложенные по префиксу, — объекты, отложенные по путям с данным префиксом
восстанавливать отложенный по префиксу объект с ближайшим временем восстановления
проверять, имеются ли объекты, отложенные по префиксу
восстанавливать все объекты, отложенные по префиксу
concurrent: после того, как Suspender создан и запущен, можно работать с ним из нескольких потоков без ограничений. Реализация с этой точки зрения fine-grained — на практике блокировки удерживаются только на время поиска узла дерева отложенных объектов, соответствующего данному пути
покрыта тестами на 95%
Использовали в паре проектов на работе.
Имеется зависимость от библиотеки slf4j-utils, которой в центральном Maven-репозитории нет. Найти её можно здесь:
https://github.com/devromik/slf4j-utils
Библиотека малюсенькая, при желании можно выпилить, заменив на что-то своё.
pom.xml имеет несколько профилей, которые я обыкновенно использую в своих проектах.
Поэтому, прежде чем собирать, желательно заглянуть в этот файлик.
Более подробное описание библиотеки можно найти в заголовочном комментарии к интерфейсу Suspender.
P. S.: приветствуются вопросы, pull-request-ы, замечания, предложения
было бы хорошо привести там readme.md с примером юзания, что бы наглядность была
Здравствуйте, devromik, Вы писали:
D>Коллеги, привет!
D>https://github.com/devromik/suspender
Расскажите, пожалуйста, о типичном юзкейсе использования такой библиотеке, а то для меня как-то такой паттерн вновинку.
Z>Расскажите, пожалуйста, о типичном юзкейсе использования такой библиотеке, а то для меня как-то такой паттерн вновинку.
Её действительно можно использовать
крайне редко.
Первый признак — не хватает возможностей
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/DelayQueue.html
Вариант использования:
Предположим, в некоторую вымышленную систему поступает непрерывный поток заявок, которые нужно обрабатывать на внешних устройствах/сервисах. Каждая заявка обрабатывается на одном и только на одном устройстве. Устройство практически никогда не отказывает, но часто отвечает, что не может обработать заявку (например, исчерпано количество подключений, допускаемых лицензией). Поэтому можно отложить заявку на определённое время и попробовать её выполнить повторно по истечении этого времени (особенно, если об этом сказано в требованиях к системе
). Можно было бы хранить отложенные заявки во внешнем хранилище, но, с учётом указанных условий, это будет performance hit. Есть также ситуации, когда системе становится известно, что оборудование перешло из неработоспособного состояния в работоспособное. В этом случае, восстанавливаются все отложенные заявки, соответствующие этому оборудованию. Есть ситуации, когда становится известно, что перегруженное оборудование
немного освободилось. В этом случае, восстанавливается только заявка с ближайшим временем восстановления.
В той же самой вымышленной системе могут быть и другие варианты использования. В этом случае, в целях повышения производительности, разделяем их, используя пути. Например, /equipment/<equipment_id>/request/<request_id>, /pizzeria/<pizzeria_id>/order/<order_id>.
Вариант использования с пиццерией можно было бы расписать подробнее, но лень
Суть в том, что не хватает курьеров, а когда курьер освобождается, ему нужно взять некоторый заказ в обработку. Желательно, самый давний. И т. д. Предполагается, что все заказы распределены по операторам и операторам не нужно обмениваться заказами. Если такая необходимость возникнет, можно интегрировать Suspender с БД (не будем вдаваться в детали).
Здравствуйте, raydac, Вы писали:
R>было бы хорошо привести там readme.md с примером юзания, что бы наглядность была
Создал задачку у себя в треккере, чуть позже запилю
Здравствуйте, devromik, Вы писали:
Z>>Расскажите, пожалуйста, о типичном юзкейсе использования такой библиотеке, а то для меня как-то такой паттерн вновинку.
D>Её действительно можно использовать крайне редко.
D>Первый признак — не хватает возможностей https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/DelayQueue.html
D>Вариант использования:
вы использовали элементы теории массового обслуживания?
Здравствуйте, raydac, Вы писали:
R>было бы хорошо привести там readme.md с примером юзания, что бы наглядность была
Добавил, но пока привёл только общую информацию об использовании,
и предложил посмотреть тесты, чтобы увидеть примеры использования (по примеру
https://github.com/angryziber/patterns).