31.4. 在 OSGi 容器中发布服务
概述
当您开发将部署到 OSGi 容器中的应用程序时,您需要通过打包捆绑包的生命周期协调发布和停止端点。您希望在捆绑包启动时发布端点,并且您希望在捆绑包停止时停止端点。
您可以通过实施 OSGi 捆绑包激活器将端点生命周期捆绑到捆绑包的生命周期中。OSGi 容器在启动时使用捆绑激活器为捆绑包创建资源。容器也使用捆绑包激活器在停止捆绑包资源时清除捆绑包资源。
bundle activator 接口
您可以通过实施 org.osgi.framework.BundleActivator 接口为应用程序创建捆绑包激活器。BundleActivator 接口显示在 例 31.4 “bundle Activator Interface” 中,它有两种方法需要被实施。
例 31.4. bundle Activator Interface
interface BundleActivator { public void start(BundleContext context) throws java.lang.Exception; public void stop(BundleContext context) throws java.lang.Exception; }
启动捆绑包时,容器调用 start ()
方法。这是您实例化并发布端点的位置。
stop ()
方法在停止捆绑包时由容器调用。这是您要停止端点的位置。
实施起始方法
bundle activator 的 start 方法是您发布端点的位置。要发布端点,start 方法必须执行以下操作:
-
“实例化服务提供商”一节 适用于服务供应商的
javax.xml.ws.Endpoint
对象。 - 创建在发布服务提供商时要使用的可选服务器上下文。
-
“发布服务供应商”一节 使用其中一个
publish ()
方法的服务提供商。
例 31.5 “bundle Activator Start Method for Publishing a Endpoint” 显示发布服务提供商的代码。
例 31.5. bundle Activator Start Method for Publishing a Endpoint
package com.widgetvendor.osgi; import javax.xml.ws.Endpoint; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class widgetActivator implements BundleActivator { private Endpoint endpt; ... public void start(BundleContext context) { WidgetOrderImpl impl = new WidgetOrderImpl(); endpt = Endpoint.create(impl); endpt.publish("http://localhost:9000/SoapContext/SoapPort"); } ... }
例 31.5 “bundle Activator Start Method for Publishing a Endpoint” 中的代码执行以下操作:
实例化服务实施对象的副本。
为服务实施创建未发布 端点
。
在 http://localhost:9000/SoapContext/SoapPort 发布服务供应商。
实施 stop 方法
bundle activator 的 stop 方法是您清理应用程序使用的资源的地方。其实施包括用于停止应用程序发布的所有端点的逻辑。
例 31.6 “bundle Activator Stop Method for Stopping a Endpoint” 显示停止已发布端点的 stop 方法。
例 31.6. bundle Activator Stop Method for Stopping a Endpoint
package com.widgetvendor.osgi; import javax.xml.ws.Endpoint; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class widgetActivator implements BundleActivator { private Endpoint endpt; ... public void stop(BundleContext context) { endpt.stop(); } ... }
通知容器
您必须添加通知容器,应用程序捆绑包包含捆绑包(Bundleivator)。您可以通过在捆绑包的清单中添加 Bundle-Activator
属性来完成此操作。此属性告知容器在激活捆绑包时要使用的捆绑包中。其值是实施捆绑包激活的类的完全限定名称。
例 31.7 “bundle Activator Manifest Entry” 显示捆绑包的清单条目,其激活器由 class com.widgetvendor.osgi.widgetActivator
实施。
例 31.7. bundle Activator Manifest Entry
Bundle-Activator: com.widgetvendor.osgi.widgetActivator