在Wildfly中,OSGI可以替代模块间服务注入?

Amp*_*ard 10 osgi dependency-injection cdi weld wildfly

我们正在解开经典的传统单片EAR打包Java EE应用程序.我们(最复杂的)组件布线模式如下:组件A'需要'接口X,而组件B和C(... N)每个'提供'接口X.我们的要求是打包和部署A,B,C和X分开独立,以最大限度地减少停机时间并最大限度地减少业务影响.

因此,我们需要必要的健壮性,以允许在运行时删除和添加(重新部署)接口的提供者(B,C),而无需重新部署接口的消费者(A),也不需要重新启动服务器.该解决方案将在Wildfly 8上运行,但只要它们可以在Wildfly 8上运行,就可以使用它们或其他技术.

我们使用JBoss-OSGI和Weld-OSGI实现了POC,它满足了我们的所有要求,并为我们提供了出色的迁移路径.但是,在Wildfly 8 Alpha 3中,JBoss-OSGI已从默认发行版中删除.这让我们认为我们应该探索更符合Wildfly背后人们思想的替代方案.

因此,问题是,在Wildfly 8上,OSGI可以替代满足我们要求的模块间服务注入的替代方案是什么?

为了预算,简单性,性能开销和公司策略,我们必须消除以下内容:
1.远程EJB
2. Web服务
3. JSon/Rest
4. SCA

请注意,这不是要求就OSGI的可行性进行辩论,也不是对不同解决方案的评估或比较.我只是在寻找符合我们标准的任何解决方案,而不是基于OSGI.

Nei*_*ett 10

既然你在询问WildFly背后的人的想法,我会推荐你​​下面的邮件列表消息.它由David Lloyd发布到Jigsaw开发列表中,他是(我相信)WildFly所基于的JBoss Modules的设计者.上下文是关于在Jigsaw中引入服务模型的讨论:http://mail.openjdk.java.net/pipermail/jigsaw-dev/2012-February/002161.html

大卫似乎在说的是服务本身的概念有缺陷 - 即你不需要它们! - 或者已经通过Java 6中引入的ServiceLoader API充分解决了该需求.

但是,已知ServiceLoader不能在使用类加载器隔离的模块系统上工作,包括OSGi和JBoss模块.这是因为ServiceLoader使用类路径扫描,而在模块系统中没有"类路径".在OSGi中,我们已经推出了一种适应ServiceLoader的方法(虽然它很令人讨厌并且需要字节码重叠).也许JBoss模块也有办法解决这个问题,但我从他们的文档快速扫描中找不到任何东西.

无论如何,正如我在上面的评论中所说,我对你的动机感到困惑.您显然可以从OSGi提供的服务模型中获益,并且红帽仍然可以支持JBoss-OSGi ......那么为什么不继续使用它?特别是如果没有任何东西可以通过WildFly开箱即用,可以满足您的需求.

  • 你能否支持一下jboss-osgi仍然可以得到Red Hat支持的声明?据我所知(并且我长期以来一直在讨论这个问题,同时还有RH的支持),它永远不会得到红帽的支持,只有社区的努力,而现在甚至不是.它也不适用于Wildfly的任何最终版本的OOB(参见[this](https://developer.jboss.org/thread/238007)和[this](https://developer.jboss.org/thread/) 237976)),负责整合的人(Thomas Diesler)不再是Red Hat的员工. (3认同)
  • 好的,我只是注意到此消息是在2013年编写的。当时,至少有一个想法可以支持JBoss-OSGi,因此在这一方面,这个答案可能已经过时了。 (2认同)