java - 声明式 OSGi 服务

标签 java service osgi

我对声明式 OSGi 服务有疑问。我有以下界面:

  public interface PrintService {
    public void print();
  }

及其实现:

    public class PrintServiceImpl implements PrintService {

      @Override
      public void print() {
        System.out.println("Hello from PrintServiceImpl!");
      }
    }

OSGI-INF/component.xml :

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="service">
   <implementation class="service.PrintServiceImpl"/>
   <service>
      <provide interface="print.PrintService"/>
   </service>
</scr:component>

list .MF:

Service-Component: OSGI-INF/component.xml

在我安装并启动该服务后,没有任何反应。如何激活它并向控制台打印“Hello from PrintServiceImpl!”。

最佳答案

您应该明确表示您希望服务在 bundle 启动时启动。否则,它会延迟实例化,如果没有其他服务需要 PrintService,它根本不会被实例化。

您可以使用属性 enabledimmediate 来控制您的服务生命周期(关于 bundle 生命周期)。 enabled 是微不足道的:指示当 bundle 启动时您的服务是否已启用。 immediate 指示此服务是否是惰性的。 immediate="true"立即启动您的服务,immediate="false" 将应用惰性实例化(即等到其他服务请求此服务服务作为依赖)

例如

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="PrintService"
activate="activate" 
deactivate="deactivate"
modified="modified"
enabled="true" 
immediate="true">

正如 Chris 提到的,如果你希望你的服务在激活时做一些事情,你应该在 activate 生命周期方法中添加一些代码(注意方法的名称可以在组件中指定描述符就像上面明确完成的那样)

protected final void activate() {
    print();
}

关于java - 声明式 OSGi 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11009790/

相关文章:

java - 将 HMAC 函数从 Java 转换为 JavaScript

java - Apache SMTPClient 与 gmail 的连接时间

java - Spring Security + Flex + BlazeDS 登录问题

silverlight - 从 RIA 服务加载数据时,Silverlight 中的零星 Arg_COMException

java - Knopflerfish,在 bundle 中使用外部库

java - 为什么我可以在 Groovy 的 List 接口(interface)中使用方法 'each'?

.net - 安装 Windows 服务并进行恢复操作以重新启动

android - AppWidgetProvider(Widget) 与 Android 服务

java - 如何创建支持 Spring 的 Eclipse 插件?

java - 谁能提供一个通过 main() 启动 OSGi 应用程序的简单示例