是的,OSGi 可以在这方面为您提供很多帮助。
您选择的架构看起来不错,我建议也许还按照 Christian 的建议添加一个“SessionManager”。
关于您需要的 OSGi 细节:
如果您有两个不同版本的“服务”包,它们打包在同一个 Java 包中,那么在清单中导出它们时,您绝对应该定义包版本:
在服务 V1 中:
Export-Package: com.acme.foo;version="1.24"
在服务 V2 中
Export-Package: com.acme.foo;version="2.3"
然后,您可以通过定义限制来控制在 Web 包中导入哪个包,例如整个间隔:
Import-Package: com.acme.foo;version="[1.23, 2)"
这样做的美妙之处在于,由于 OSGi 的模块化和捆绑包的单独类加载器,com.acme.foo 的两个版本都可以在同一个系统中安装和使用。您无法在“通常的”Java 设置中实现这一点,因为只有一个类加载器,并且包的一个版本会影响另一个版本。
例如,您可以在此处查看 OSGi 演示和示例
这是关于包和库的。现在关于实际的服务对象:
您还可以在 OSGi 服务注册表中发布同一服务的两个版本。区分两者的最简单方法是在注册服务时使用服务属性:
Hashtable properties = new Hashtable();
properties.put( "service_flavour",
"advanced" );
context.registerService(
SomeService.class.getName(),
this, properties );
然后,您可以使用这些道具在 Web 包中查找正确的服务:
ServiceTracker someServiceTracker = new ServiceTracker(bc, "(&(objectclass="+SomeService.class.getName()+")(service_flavour=advanced))", null);
someServiceTracker.open();
关于您关于 EBA 的问题-我不确定您的意思。您可以在任何 OSGi 框架中安装任意数量的包,并且它们都可以在 OSGi HTTP 服务中以不同的别名注册。只要别名之间没有冲突就可以了。如果需要,您还可以拥有一个主 servlet,并将不同页面的处理分发给其他包,而无需将它们也注册为 servlet - 例如,您的主 Web servlet 可以在 OSGi 服务注册表中查找它们,然后分发工作。这完全取决于您是否期望更多的应用程序逻辑/计算等,或者更多的是关于一些现有数据的格式化和表示。
希望这可以帮助。