2

我在 Java EE 环境中工作,其中每个应用程序都在自己的 war 文件中。在每个应用程序 war 文件的 WEB-INF/lib 中都有一个由所有应用程序共享的公共 jar。这个常见的 jar 包含几个 Singleton,可以从代码中的许多点访问。由于战争文件的边界,每个应用程序都有自己的单例实例。这就是我们今天的操作方式,因为我们想在每个应用程序中以不同的方式配置一些单例。

现在我们正在转向一个 OSGi 环境,因为每个包都有自己的类加载器,所以这个解决方案将不再工作,所以如果我尝试从包“appA.jar”或从包访问驻留在包“common.jar”中的 MySingleton bundle "appB.jar" 我会得到相同的实例。

请记住,我“想要”每个捆绑包有一个不同的单例实例。(听起来很讽刺)

现在我意识到理想的解决方案是修复代码不依赖于那些单例,但是由于时间紧迫,我想知道你们是否可以建议某种迁移解决方案,让我可以使用捆绑范围的单例所以每个包都可以配置。

4

3 回答 3

2

您的单例将成为 OSGi 中的一项服务。

然后您需要创建一个 ManagedServiceFactory(例如参见本文),负责注册该服务的不同实例;每个服务都将注册不同的属性(fi application="appA" and application="appB")

之后,您将从任何执行正常服务查找并指定正确属性的应用程序访问正确的服务。

于 2009-08-24T17:52:47.277 回答
1

单例确实映射到服务。如果应用程序(appA、appB)实际上是捆绑包,则将您的服务实现为 ServiceFactory。这将允许您自动为每个调用包返回一个单独的实例。这将比 ManagedServiceFactory(需要为每个实例显式配置)或黑客获取器更容易。

于 2010-05-11T22:50:12.443 回答
1

我能想到几个选择:

  1. 将 common.jar 中所有类的副本直接包含在 WAR 包中。
  2. 在每个 WAR 包中嵌套 common.jar,然后修改 MANIFEST.MF 中的包类路径以包含嵌套的 jar:Bundle-ClassPath: ., common.jar
  3. 修改单例以使用 OSGi 服务,并使用 ServiceFactory 确保每个请求包都接收到它自己的该服务实例。您需要缓存服务实例(不要获取/使用/取消获取)以避免在每次访问时获取新实例。
于 2009-08-23T16:03:27.927 回答