Службы синхронизации OSGI

Можно ли синхронизировать службу osgi извне, из другого пакета?

OsgiService oS = retrieveService(BundleContext);

synchronized(oS){
...
}

Я не хочу, чтобы вызовы извне пакета вносили изменения во время выполнения определенного метода внутри.

Пакет зарегистрирован и активен. Я работаю в рамках Equinox.


person Imnl    schedule 19.06.2013    source источник
comment
Если вы хотите использовать службу OSGi из другой системы, вам следует подумать об использовании DOSGi, CXF имеет довольно хорошую реализацию, которая также дает вам возможность совместно использовать службу OSGi как веб-службу.   -  person Achim Nierbeck    schedule 20.06.2013
comment
Поскольку предложенный код в целом является плохой идеей, мне очень любопытно, каков ваш вариант использования в реальном мире?   -  person Peter Kriens    schedule 24.06.2013
comment
синхронизация самодельного контроллера версий с событиями в реальном времени, которые могут привести к изменению значения версии.   -  person Imnl    schedule 28.06.2013


Ответы (2)


Нет. Когда вы публикуете службу, вы объявляете ее общедоступной без ограничений на способ ее использования. Например, вы не можете ограничить другие пакеты вызовом методов в определенном порядке или потребовать от них использования синхронизации или всегда вызывать из определенного потока. Поэтому вы должны исходить из того, что вас будут вызывать из любого потока, без синхронизации и т. д.

Если внутреннее состояние реализации вашего сервиса хрупкое и требует синхронизации, вы обязаны сделать это внутри своей реализации. Вы не можете навязать эту работу кому-то другому.

person Neil Bartlett    schedule 19.06.2013
comment
Я должен использовать их извне, поэтому я думаю, что мне придется реализовать решение Semaphore. - person Imnl; 19.06.2013
comment
Извне чего? Вне пакета? Вне JVM? Компьютер? - person Neil Bartlett; 19.06.2013
comment
Вне комплекта, тот же компьютер, тот же jvm - person Imnl; 20.06.2013
comment
Хорошо. Ну, это стандартное использование OSGi Services. То есть, если вы, по крайней мере, не публикуете вне пакета, то вам не нужен сервис. - person Neil Bartlett; 20.06.2013

При определенных ограничениях да, так как платформа Equinox не создает прокси для сервисов. Однако это очень хрупкое решение, так как другие части системы могут или не могут синхронизировать эти вызовы...

Знаете ли вы, что вы можете заменить службы в OSGi? Создайте класс, который поддерживает все подходящие интерфейсы для вашего варианта использования, но который публикуется как служба с более высоким SERVICE_RANKING, чем существующая служба; это приведет к тому, что этот экземпляр будет предпочтительным при поиске служб. Теперь этот класс делегирует все вызовы методов исходной службе, которую он получает с помощью декларативных служб, ServiceTracker или BundleContext; во всех случаях с использованием фильтра для SERVICE_RANKING. Это позволяет вам перехватывать все вызовы методов и, например, регистрировать или синхронизировать их.

Надеюсь это поможет...

person Tassos Bassoukos    schedule 19.06.2013
comment
Ранжирование сервисов не является надежным способом перехвата сервисов, потому что потребители сервисов не обязаны обращать внимание на ранжирование. Если вам действительно нужно спроектировать какой-то аспектный сервис, подобный этому, вам следует использовать Filter/ListenerHooks, чтобы полностью скрыть обернутый сервис. Но я думаю, что это, вероятно, слишком много для того, что хотел сделать ОП. - person Neil Bartlett; 19.06.2013
comment
@NeilBartlett Действительно. Обратите внимание, что у меня сложилось впечатление, что согласно спецификации OSGi, когда запрашивается одна служба, платформа возвращает службу (ссылку) с наивысшим рейтингом (5.2.6, 5.2.8, 701.7.5.11). - person Tassos Bassoukos; 20.06.2013
comment
Да, это правда. Пока не применяется другой фильтр и т. д. - person Neil Bartlett; 21.06.2013
comment
И пока вы успеваете... такой подход создает проблемы с заказом, поскольку несинхронизированная служба может быть зарегистрирована первой. - person Peter Kriens; 24.06.2013
comment
То же самое можно сказать и об использовании хуков, так как их нужно сначала зарегистрировать. - person Marcel Offermans; 26.06.2013