1

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

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

在此处输入图像描述

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

谢谢,

呸。

4

2 回答 2

2

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

希望以上所有内容对您有意义。如果不给我发电子邮件,我们可以更深入地讨论它。:) 有时图片会表达更多的句子,如果你愿意,我可以画一些。;)

问候。基督教

于 2012-06-04T20:04:36.663 回答
1

是的,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 服务注册表中查找它们,然后分发工作。这完全取决于您是否期望更多的应用程序逻辑/计算等,或者更多的是关于一些现有数据的格式化和表示。

希望这可以帮助。

于 2012-06-05T08:43:53.030 回答