OSGi对我们来说是正确的方法吗?

时间:2012-06-04 19:38:41

标签: osgi

我们必须同时支持至少2个版本的功能。它可以在Web端或服务中,这意味着我们将为Web中的不同用户提供不同的布局,或者服务实现对于不同的用户将是不同的。我们应该能够根据用户的登录信息将用户路由到正确版本的Web应用程序/包。

我们想到了这样的事情(请在这里查看更大的图片http://i.stack.imgur.com/6NxhF.png)。

enter image description here

是否可以将多个Web应用程序/软件包部署为一个EBA?如果是,是否可以在这些Web应用程序/软件包之间共享会话?我们是OSGi的新手,期待对我们选择的设计提出任何建议。感谢对此的任何帮助/建议。

谢谢,

巴布。

2 个答案:

答案 0 :(得分:2)

OSGi可能适合您。在我上一个项目中,我们有一些与你的方法相当的东西我们开发了一个带有OSGi的后端系统,我们有一个后端连接器作为不同其他想要使用后端功能的捆绑包的起点。在您的情况下,后端是您的共享捆绑上下文。然后,我们有一个SOAP Web服务,几个servlet和webpages(也应该是基于OSGi),它们将请求发送到后端连接器。当然,您可以直接向内部捆绑包发送请求,例如您的经理,但我会建议分层架构。在共享会话的情况下:问题是哪个组件负责处理会话?如果您不仅希望在您的环境中使用Web应用程序,则可以通过数据库或内存方法管理会话。然后,共享上下文中的“SessionManager”包负责创建用户会话(用于标识的sessionid),关联sessionid和临时数据,获取sessionid的数据以及删除sessionid的临时数据。使用此方法,每个客户端请求都应发送sessionid,该sessionid将在共享上下文中的某个位置进行验证。那你就不需要网络会议了。创建的sessionid可以存储在用于通信的Request / Response的特定HTTP头条目中。但那只是一种方法。

希望以上所有内容都能为您提供帮助。如果没有给我发电子邮件,我们可以更深入地讨论它。 :)有时候图片会说更多的句子,如果你愿意,我可以画出一些。 ;)

问候。 基督徒

答案 1 :(得分:1)

是的,OSGi可以为您提供很多帮助。

您选择的架构看起来很好,我建议也可以按照Christian的建议添加“SessionManager”。

关于OSGi细节,您将需要:

如果您有两个不同版本的“Services”包,它们打包在相同的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演示和示例,例如here

这是关于包和库的。 现在关于实际的服务对象:

您还可以在OSGi Service Registry中发布同一服务的两个版本。区分二者的最简单方法是在注册服务时使用服务属性:

Hashtable properties = new Hashtable();
properties.put( "service_flavour",
"advanced" );
context.registerService(
SomeService.class.getName(),
this, properties );

然后,您可以使用props在Web包中查找正确的服务:

ServiceTracker someServiceTracker = new ServiceTracker(bc, "(&(objectclass="+SomeService.class.getName()+")(service_flavour=advanced))", null);
someServiceTracker.open();

关于你关于EBA的问题 - 我不确定你的意思。您可以在任何OSGi框架中安装任意数量的软件包,并且它们都可以在OSGi HTTP服务中的不同别名下注册。只要别名没有相互冲突就可以了。如果需要,您还可以拥有一个主servlet,并将不同页面的处理分发给其他bundle而不必将它们注册为servlet - 例如,您的主Web servlet可以在OSGi服务注册表中查找它们并分发工作。这完全取决于您是否期望更多应用程序逻辑/计算等,或者更多地是关于某些现有数据的格式化和表示。

希望这有帮助。