Создайте сервис и разрешите только одному пакету хранить этот сервис в любое время
Я пытаюсь создать сервис таким образом, чтобы после его создания он мог удерживаться только одним потребителем / пакетом в любой момент времени. (Если это противоречит философии / спецификации OSGi, то это, очевидно, дает быстрый ответ, но ссылка на спецификации OSGi. Заявление будет приветствоваться.)
Чтобы реализовать такое требование, я реализовал интерфейс ServiceFactory, думая, что когда бы ни было требование для службы, getService(Bundle bundle, ServiceRegistration<S> registration)
метод будет вызван, и это было бы, где я мог бы определить, если Bundle
был новый потребитель или нет и действовать соответственно.
Похоже, что это не тот случай в сценарии, в котором я проверял это.
Использование Apache Karaf и создание экземпляра пользователя Сервиса через Blueprint может показаться, что getService
метод никогда не вызывается. Вместо этого метод привязки потребителя для службы вызывается напрямую, но внедряет объект прокси-службы.
Хотя я понимаю, что Blueprint использует прокси-серверы, безусловно, существует обязанность ServiceFactory
выполнить контракт, даже если это прокси-объект, потребляющий услугу?
Почему я хочу это сделать? Я пытаюсь обернуть JavaFX и Stage
класс и потому, что JavaFX не OSGi дружественный, я пытаюсь координировать доступ к Stage
объект. Я знаю, что есть фреймворки, такие как Drombler, но краткий взгляд на них заставил меня подумать, что это не подходит для моего варианта использования. Они кажутся слишком строгими для моих нужд, например, я не обязательно хочу размещать приложение так, как использует Drombler.
2 ответа
Это зависит от того, что вы подразумеваете под потребителем. ServiceFactory дает вам возможность создать отдельный экземпляр сервиса для каждого пакета, который вызывает getService
к вашим услугам. Это не ясно из вашего вопроса, но я подозреваю, что вы не видели getService
вызывается несколько раз, потому что вы выбирали сервис из одного и того же потребительского пакета. В этом случае ServiceFactory просто несколько раз возвращает один и тот же объект.
Что касается вашего общего вопроса об ограничении доступа для одного потребителя, нет, это действительно противоречит философии OSGi. Извините, у меня нет ссылки на спецификацию для вас, но подсказка в названии: это сервис, который доступен для всех.
Я знаю, что есть фреймворки, такие как Drombler, но краткий взгляд на них заставил меня подумать, что это не подходит для моего варианта использования. Они кажутся слишком строгими для моих нужд, например, я не обязательно хочу размещать приложение так, как использует Drombler.
Обратите внимание, что макет приложений Drombler FX является подключаемым, поэтому вы можете предоставить собственную реализацию с учетом ваших потребностей. Это позволяет максимально использовать возможности Drombler FX и JavaFX.
Хотя эта функция доступна в течение некоторого времени, теперь есть новый учебник, объясняющий ее более подробно.