Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OSGi是适合我们的方法吗?_Osgi - Fatal编程技术网

OSGi是适合我们的方法吗?

OSGi是适合我们的方法吗?,osgi,Osgi,我们必须同时支持至少两个版本的功能。它可以在web端或服务中,这意味着我们将为web中的不同用户提供不同的布局,或者为不同的用户提供不同的服务实现。我们应该能够根据用户的登录将其路由到web应用程序/捆绑包的正确版本 我们想到了这样的事情(请看这里的大图) 是否可以将多个web应用程序/捆绑包部署为一个EBA?如果是,是否可以在这些web应用程序/捆绑包之间共享会话?由于我们是OSGi的新手,期待着对我们选择的设计提出任何建议。感谢您在这方面提供的任何帮助/建议 谢谢 宝贝。OSGi可能很适合

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

我们想到了这样的事情(请看这里的大图)

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

谢谢


宝贝。

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

希望所有这些对你都有意义。如果没有,请给我发电子邮件,我们可以更深入地讨论。:)有时候,图片会说更多的句子,如果你愿意,我可以画一些

你好。
Christian

是的,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框架中安装任意数量的bundle,它们都可以在OSGiHTTP服务中以不同的别名注册。只要别名之间没有冲突,就可以了。如果需要,您还可以拥有一个主servlet,并将不同页面的处理分发给其他bundle,而无需将它们注册为servlet——例如,您的主web servlet可以在OSGi服务注册表中查找它们,并分发工作。这完全取决于您是否期望更多的应用程序逻辑/计算等,还是更多地关注一些现有数据的格式和表示


希望这能有所帮助。

我添加了更好图片的链接,请回复。不知道如何直接发送电子邮件给你。如果可能的话,我想和你联系进一步讨论。在我的档案上,你可以找到我网站的链接。实际上是德语,但只要点击页脚的“Impressum”,你就会找到联系方式。谢谢回复。由于我在度假,我对迟来的答复表示歉意。今天早上,我开始用一个web包(上面有Spring)和几个其他包(service、util等)创建osgi应用程序。我在部署期间遇到异常。org.apache.bval.jsr303.ApacheValidationProvider与javax.validation.spi.ValidationProvider不兼容。看起来,试图解决此问题的某些冲突将被更新。@Bab如果不是版本不兼容,那么这将是因为验证程序使用的是Java的SPI,它在OSGi中不起作用,您需要提供一个自定义的ValidationProviderResolver来解决此问题,并自己连接工厂。