Есть ли способ в OSGi, чтобы убедиться, что только одна вещь имеет доступ к службе одновременно? - PullRequest
0 голосов
/ 04 августа 2011

У меня есть интерфейс, который определяет устройство в системе.Устройства предназначены для использования только одним объектом одновременно.Я хотел бы зарегистрировать каждое устройство в качестве службы OSGi, чтобы другие могли получать доступ к устройствам через этот механизм (используя декларативные службы или средство отслеживания служб).Однако этот механизм, насколько мне известно, позволяет всем сущностям запрашивать одну и ту же услугу.

Есть ли способ, чтобы только первый запросивший получил услугу или используя декларативные услуги, только один компонент службы был удовлетворен?

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Используйте ServiceFactory для реализации службы устройства. Затем вы можете вернуть уникальный сервисный объект каждому пакету, а затем использовать этот объект для сериализации доступа. С другой стороны, ваша ServiceFactory может возвращать значение null для других пакетов, если есть какой-либо другой пакет, который в настоящее время имеет доступ к службе.

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

1 голос
/ 04 августа 2011

AFAIK, вы не можете использовать DS для навязывания единой потребительской политики.

На первый взгляд ServiceFactory может работать, и если бы это было так, это было бы самым простымпуть.

Однако есть одно предостережение : "The Framework caches the value returned (unless it is null), and will return the same service object on any future call to BundleContext.getService for the same bundle. This means the Framework must not allow this method to be concurrently called for the same bundle"

Так что я думаю, что это не удастся в следующем сценарии:

Given Bundle A, Service S and Bundle B;
A gets S, then A ungets S, Bgets S, then A gets S.

Кэш фреймворка вполне может помешать и дать A кешированную S, даже если он думал, что он уже хранится в B.

Единственная альтернатива, о которой я могу подумать, это использовать FindHook хотя это немного более низкий уровень, и вы, вероятно, захотите реализовать другие хуки (EventHook, ListenerHook) для полноты.

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

...