Решение по миграции для синглетонов в среде OSGI - PullRequest
2 голосов
/ 23 августа 2009

Я работаю в среде Java EE, в которой каждое приложение находится в собственном военном файле. В WEB-INF / lib каждого файла war приложения есть общий jar, который используется всеми приложениями. Эта общая банка содержит несколько синглетонов, доступ к которым осуществляется из многих точек кода. Из-за границ военного файла каждое приложение имеет свои экземпляры Singletons. Именно так мы сегодня работаем, так как мы хотим настроить некоторые синглтоны по-разному в каждом приложении.

Теперь мы движемся к среде OSGi, где это решение больше не будет работать, поскольку каждый пакет имеет свой собственный загрузчик классов, поэтому, если я попытаюсь получить доступ к MySingleton, который находится в пакете "common.jar" из пакета "appA.jar" "или из пакета" appB.jar "я получу тот же экземпляр.

Помните, что я "хочу" другой экземпляр синглтона для пакета. (как ни парадоксально это звучит)

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

Ответы [ 3 ]

2 голосов
/ 24 августа 2009

Ваш синглтон станет сервисом в OSGi.

Затем вам нужно создать ManagedServiceFactory (см., Например, эту статью ), ответственную за регистрацию различных экземпляров этой службы; каждая служба будет зарегистрирована с разными свойствами (например, application = "appA" и application = "appB")

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

1 голос
/ 12 мая 2010

Синглтоны действительно отображаются на сервисы. Если приложения (appA, appB) на самом деле являются пакетами, то реализуйте свой сервис как ServiceFactory. Это позволит вам автоматически возвращать отдельный экземпляр для каждого вызывающего пакета. Это будет проще, чем ManagedServiceFactory (который требует явной настройки для каждого экземпляра) или хакерские методы получения.

1 голос
/ 23 августа 2009

Я могу придумать несколько вариантов:

  1. Включите копию всех классов в common.jar непосредственно в комплект WAR.
  2. Вложите common.jar в каждый WAR-пакет, затем измените путь к классу пакета в MANIFEST.MF, включив в него вложенный jar: Bundle-ClassPath:., Common.jar
  3. Измените синглтон для использования служб OSGi и используйте ServiceFactory, чтобы гарантировать, что каждый запрашивающий пакет получает свой собственный экземпляр этой службы. Вам нужно будет кэшировать экземпляр службы (не получать / использовать / отменять), чтобы избежать получения нового экземпляра при каждом доступе.
...