Я столкнулся с проблемой OSGi, и я недостаточно хорошо разбираюсь в деталях OSGi, чтобы понять, что делать дальше.
Моя проблема такова:
- У меня есть служба, которая находится за четко определенным интерфейсом и периодически создает файл в определенном месте. Это контролируется администратором конфигурации (через файл конфигурации в Karaf) .
- Некоторые компоненты предоставляют эту услугу другим через файл функций Karaf, связывая мою службу с определенной версией (1.X.0)
- Другие компоненты предоставляют эту услугу в более новой версии (1.Y.0, где Y > X), либо через другой файл функций, либо просто добавляя ее в свой файл kar.
Поскольку это лишь незначительные изменения версии, службам-потребителям все равно, с какой службой они взаимодействуют (API тот же).
Моя проблема в том, что оба этих пакета активны в karaf, и существует условие гонки относительно того, кто перезапишет чей выходной файл.
Я попытался превратить @Component
в синглтон (используя scope = ServiceScope.SINGLETON
), и, хотя это могло бы решить проблему каждого потребителя службы, использующего одну и ту же реализацию, проблема с перезаписью файлов сохраняется, поскольку обе службы активны.
В основном, я ищу способ сказать OSGi "не заморачиваться со старыми версиями, новая версия (которая такая же основная, как и другие) подходит для всех потребителей (которые используют по умолчанию [1.X,2[
)
Поскольку файл конфигурации похож на "API" для включения моего сервиса, я хотел бы избежать наличия нескольких файлов конфигурации для разных версий.
Если возможно, я хотел бы оставить логику определения местоположения версии вне моей службы. Я предполагаю, что теоретически служба может прослушивать другие версии пакетов, предоставляющих тот же интерфейс службы, и предпринимать соответствующие действия, но мне это кажется очень громоздким. Наверняка есть лучший способ, который меньше влияет на код бизнес-логики (т.е. мой сервис)?