Servicemix 4、DOSGi 和 Zookeeper
Posted
技术标签:
【中文标题】Servicemix 4、DOSGi 和 Zookeeper【英文标题】:Servicemix 4, DOSGi, and Zookeeper 【发布时间】:2010-12-01 15:46:51 【问题描述】:这是fusesource forum 和servicemmix forum 交叉发布的。
我无法让 DOSGi 在 FUSE 中工作。我正在尝试通过 Zookeeper 发现将 CXF 的 DOSGi 1.1-SNAPSHOT 放到 FUSE 4.1.0.2 上。我也在使用 Zookeepr 3.2.1。
在 Felix 2.0.0 上一切正常。我只需按照DOSGi Discovery 页面上的说明进行操作,然后安装Discovery Demo 捆绑包。对于 DOSGi,我只使用 cxf-dosgi-ri-singlebundle-distribution-1.1-SNAPSHOT.jar 用于 DSW 和 cxf-dosgi-ri-discovery-singlebundle-distribution-1.1-SNAPSHOT.jar 用于 zookeepr 发现。然后,当我在一台机器上使用示例服务 impl 启动示例包时,我会在 zookeeper 中看到节点创建。然后我在另一台机器上启动示例客户端,并在服务机器上看到输出。效果很好。我确实有一个关于 xml 错误被忽略的警告,因为找不到一些 XSD,但它似乎没有任何影响。哦,我还要先安装 OSGi 纲要包。
当我搬到 Fuse 时,我没有这样的运气。 OSGi 纲要包附带了 fuse,因此无需安装它。我应该只能安装 dosgi-ri 单包和 dosgi-ri-discovery 单包,但这不起作用。 dosgi-ri singlebundle 有各种与 servicemix 重叠的包。我收到有关端口 8081 的错误?或者无论 osgi.http.service 参数是什么,都已经在使用中。显然 dosgi-ri singlebundle 带有 pax webservice,它读取与 servicemix 附带的 servicemix http 服务包相同的属性。那是当我切换到cxf-dosgi-ri-multibundle-distribution-1.1-SNAPSHOT.zip 并解压缩它以获取我想要的部分时。我从 dosgi-ri multibundle 中取出 dsw 包并安装它。由于 jdom 依赖性,没有运气。然后我安装了 ri multibundle 中的 jdom,它工作正常。然后回到dsw,安装,所以我想我到了某个地方。是时候回去安装 ri-discovery 单包了。当我开始时,我得到一个 pax 日志服务 classcastexception 说它不能转换为 osgi logservice 或其他东西。但这只是一个日志记录错误,在底部它说它找不到http://schemas.xmlsoap.org/soap/http 的传输类。好的,所以日志记录被搞砸了,我错过了一些运输类。好吧,很明显,这是由于 ri multibundle 没有安装足够的东西,因为它在 felix 上工作。所以里面还有什么是必要的。检查时的 cxf-minimal-bundle 缺少导致最后一个错误的类。所以我安装它。尝试启动发现包,但我最终遇到了某种 corbabroker 异常。重量级谁在这一切中使用了 corba?然后我返回并撤消所有这些并尝试坚持使用 ri 和 ri-discovery 的单捆绑发行版,但只需关闭 servicemix http 服务。这会使 servicemix 崩溃,我无法重新启动它,因为 cxf jbi 组件最终会产生不满意的依赖关系。奇怪的。我会忽略这一点,因为无论如何我都不使用它们,并尝试开始我的示例。无法启动示例,因为它说码头无法启动,因为端口已在使用中。没有意义,因为我已经关闭了 servicemix http 服务。然后我重新启动码头。作品?可能是。我的服务已注册,我可以使用 firefox 浏览到 wsdl,但在 zookeeper 中没有注册。尝试关闭 ri-discovery 包并重新启动它,但我得到一个空指针异常。显然,由于上述错误之一,ri-discovery 从未真正启动。然后我开始尝试拆开 ri-discovery 单包并取出内部部件。这不起作用,因为它显然是必要的,即使里面有一些我们可以不用的库。
故事结束。无法让它工作。其他人可以让它工作吗?我只想在 SMX4 中运行发现示例。我很确定这只是一个捆绑冲突问题。这不是 OSGi 应该解决的问题吗???这比告诉我你依赖什么 jar 并让我设置我的类路径更糟糕。至少那时我最终会让事情运行起来。
我认为,我的下一步将是再次尝试使用 ri-multibundle、dsw 和 jdom 以及 ri-discovery singlebundle。然后我会尝试一些 cxf-fuse 包或一些 cxf-rt 包来解决肥皂传输问题。
编辑说明:我需要的不仅仅是显示处于活动状态的 DOSGi 包。在您尝试通过它们公开服务之前,它们实际上并没有做太多事情。我确实需要看到多台机器向 zookeeper 实例注册服务以及其他使用这些服务的机器——就像正在运行的 DOSGi Discovery Sample 一样。
我已经能够让 cxf 将分布式服务示例公开为肥皂网络服务,方法是使用提到的最小 cxf 包,方法是删除部分原始 cxf 包并重新启动码头服务,然后启动示例服务。 ..或者通过安装cxf最小包,然后启动我的服务,然后立即卸载cxf最小包,然后重新启动码头......我认为这是顺序。这些都不会从干净的启动中工作,并且必须重新启动服务作为使 DOSGi 工作的过程是很糟糕的。我什至不知道为什么安装然后卸载会做任何事情——它不应该留下任何工件。
【问题讨论】:
【参考方案1】:第一点,看看 CXF DOSGi mega-bundle,我认为这仅适用于裸 OSGi 运行时中的快速-n-dirty hacking,基本上是 Equinox 和 Felix 提供的最小环境。它不适用于 FUSE 或 Servicemix 等更丰富的环境,因为您可能会在捆绑包和平台的服务上发生冲突,正如您所看到的那样。
我能够让 Servicemix 4.0 干净启动(这是在 Windows 上),然后我进行了热部署:
com.springsource.org.jdom-1.0.0.jar cxf-bundle-minimal-2.2.1.jar cxf-dosgi-ri-discovery-local-1.0.jar cxf.dosgi-ri-dws.cxf-1.0.jar使用 Servicemix 控制台,我列出了所有捆绑包,发现以上所有捆绑包都处于 Active
状态(如预期的那样)。我列出了这些服务,并且 2 个 CXF DOSGi 捆绑包正在导出服务,因此看起来工作正常。日志中没有报告错误。
您对 OSGi 的熟悉程度如何? Servicemix 看起来很大,一起学习 OSGi、Servicemix 和 CXF/DOSGi 并不容易(在我看来)。
提供的控制台不适合 OSGi 的东西,我建议为 web interface 安装 Apache Felix 控制台包。
【讨论】:
没有实际启动标记为发现的服务,就像我在原始帖子中提到的示例发现服务一样,不会通过 CXF 公开任何内容,因此您实际上并没有使用 cxf-bundle-minimal,甚至虽然它说是活跃的。 此外,即使您可以启动一个标记为发现的服务,并将其作为一个带有您提到的 cxf 捆绑包的肥皂网络服务,通过删除原始的冲突捆绑包,如果没有分布式发现,您也不会实际上与动物园管理员交谈。您列出的配置未能包含 cxf-dosgi-ri-discovery-singlebundle-distribution-1.1-SNAPSHOT.jar,其中包含 cxf-dosgi-ri-discovery-distributed-1.1-SNAPSHOT.jar 和 cxf-dosgi-ri- discovery-distributed-zookeeper-wrapper-1.1-SNAPSHOT.jar,以及它自己明显重要的服务聚合。 为了回答您的问题,我对 OSGi 容器本身(通过 felix 和 equinox)以及 OSGi 规范非常满意。不过,这些捆绑冲突正在杀死我。 是的,我已经看过网页界面了。以上是关于Servicemix 4、DOSGi 和 Zookeeper的主要内容,如果未能解决你的问题,请参考以下文章
在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?