31.4. 在 OSGi 容器中发布服务

概述

当您开发要部署到 OSGi 容器中的应用程序时,您需要通过打包的捆绑包的生命周期协调发布和停止端点。您需要在捆绑包启动时发布端点,并希望在捆绑包停止时停止端点。

您可以通过实施 OSGi 捆绑包激活器将端点生命周期绑定到捆绑包的生命周期。捆绑激活器由 OSGi 容器用于在启动捆绑包时为其创建资源。容器也使用捆绑激活器在停止时清除捆绑包资源。

bundle activator 接口

您可以通过实施 org.osgi.framework.BundleActivator 接口为您的应用程序创建捆绑激活器。BundleActivator 接口在 例 31.4 “bundle Activator 接口” 中显示,它有两个需要实施的方法。

例 31.4. bundle Activator 接口

interface BundleActivator
{
  public void start(BundleContext context)
  throws java.lang.Exception;

  public void stop(BundleContext context)
  throws java.lang.Exception;
}

启动捆绑包时容器会调用 start() 方法。这是您实例化并发布端点的位置。

当容器停止捆绑包时,容器调用 stop() 方法。这是您要停止端点的位置。

实施启动方法

捆绑包激活器的启动方法是您发布端点的位置。要发布您的端点,启动方法必须执行以下操作:

  1. “实例化服务提供商”一节 服务提供商的 javax.xml.ws.Endpoint 对象。
  2. 创建发布服务提供商时要使用的可选服务器上下文。
  3. “发布服务供应商”一节 服务提供商使用一个 publish() 方法。

例 31.5 “发布端点的捆绑操作器启动方法” 显示发布服务提供商的代码。

例 31.5. 发布端点的捆绑操作器启动方法

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 “发布端点的捆绑操作器启动方法” 中的代码执行以下操作:

实例化服务实施对象的副本。

为服务实施 创建 未发布的端点。

将服务提供商发布到 http://localhost:9000/SoapContext/SoapPort

实现停止方法

捆绑包激活器的 stop 方法是您清理应用程序使用的资源的位置。其实施中应包括停止应用程序发布的所有端点的逻辑。

例 31.6 “bundle Activator Stop Method 用于停止端点” 显示停止发布的端点的停止方法。

例 31.6. bundle Activator Stop Method 用于停止端点

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();
  }

  ...

}

告知容器

您必须添加相关容器,该容器应用程序捆绑包包含捆绑激活器。您可以通过在捆绑包的清单中添加 Bundle-Activator 属性进行此操作。此属性告知容器在激活捆绑包时要使用的类。其值是实施捆绑激活器的类的完全限定名称。

例 31.7 “bundle Activator Manifest Entry” 显示由类 com.widgetvendor.osgi.widgetActivator 实施的捆绑包的清单条目。

例 31.7. bundle Activator Manifest Entry

Bundle-Activator: com.widgetvendor.osgi.widgetActivator