При проектировании нашей системы OSGi
у нас есть повторяющийся сценарий, когда одна служба хочет применить определенную обработку («обращение») к подмножеству развернутых служб. В простом случае мы позволим целевым службам присвоить какое-либо свойство обслуживания, чтобы указать, что они хотят этого специального лечения, а затем оказать услуги по уходу за ними в виде доски.Положите динамический выбор сервиса OSGi в свою собственную службу?
Но как это лучше всего спроектировать, когда алгоритм для решения того, какие сервисы, поднаборные для цели, должен быть реализован с помощью логики Java
, и не легко представлен статическим свойством, заданным самими пакетами?
Кроме того, если у нас есть несколько служб лечения, которые хотят повторно использовать один и тот же сервисный таргетинг, в идеале алгоритм выбора должен быть реализован в его собственной службе. Назовем его SelectService
и скажем, что он имеет логику для динамически идентифицирующих сервисов категорий «abc» и «xyz».
Я могу думать об этих основных альтернативах, чтобы пойти по этому поводу, может быть, их больше?
Пусть
SelectService
инспектировать развернутые услуги и потом как-то (как?) Набор свойств «ABC» и «АБВ» на них, когда это применимо. Затем службы лечения могут использовать стандартServiceTracker
с фильтром свойств, чтобы найти нужные им услуги.Пусть
SelectService
предлагают методыgetAbcServices()
иgetXyzServices()
, которые возвращают некоторыеServiceTracker
-как объект. Услуги лечения могут вызывать эти методы для поиска целевых услуг.Позвольте службам лечения объявить что-либо в реестре службы (служебный интерфейс или свойство услуги), чтобы выразить заинтересованность в выборе услуг.
SelectService
затем находит эти пожелания в стиле доски и уведомляет службы лечения о выборе.Это неправильный способ думать в
OSGi
системе, и вы не должны даже хотеть сделать это :-)
EDIT 1:
Чтобы резюмировать сценарий вы можете сказать, что это похоже на услуги по расширению, такие как декларативные услуги или план:
targeted <--> extender
service service
с добавлением, что служба расширитель разделяется на две части/слоев для повторного использования логики выбора:
targeted extender extender
service <--> service <--> service
treatment ** selection
logic logic
Интересной частью является API (**) между логикой обработки и отбора, как он упоминает другие услуги а также нужен механизм добавления/удаления событий. Для понимания также желательно использовать как можно больше стандартных шаблонов OSGi и функций поддержки.
[Meta: Возможно, было бы полезно разделить обсуждение на одну ответную нить (ответ + комментарии) на альтернативу?]
Тип прецедентов проверяет такие вещи, как аннотации или объявления xml на потенциальных сервисах, и применяет какое-то поведение расширения, например DS и BluePrint, но проще. Целевые службы не обмениваются интерфейсами и не потребляются службами лечения, они как-то обрабатываются или расширяются ими. Как было сказано, я хочу повторно использовать логику выбора в нескольких службах лечения, которые ищут одну и ту же «целевую категорию», и я понимаю те же проблемы, о которых вы заявляете. Я не понимаю ваш последний абзац, вы предлагаете повторное использование через вложение? – mikewse