【问题标题】:OSGi Declarative Service (ds) usageOSGi 声明式服务 (ds) 使用情况
【发布时间】:2012-10-01 22:41:27
【问题描述】:

现在我尝试将我的 OSGi 应用程序的服务实现为 ds。

不幸的是,我不知道如何访问使用该服务。

我的服务如下所示:

public interface IService {
    public void foo(<T> bar);
}
public class ServiceImpl 实现 IService {
    公共无效foo(酒吧){
        ...
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="iservice">
   <implementation class="ServiceImpl"/>
   <service>
      <provide interface="IService"/>
   </service>
</scr:component>

就我现在而言。

但是我怎样才能访问该服务呢?

  1. 我尝试了以下解决方案:http://it-republik.de/jaxenter/artikel/OSGi-in-kleinen-Dosen-Services-auf-deklarative-Weise-2340.html

    但是 eclipse 找不到

    的导入

    ComponentContexth**p://www.osgi.org/javadoc/r4v42/org/osgi/service/component/ComponentContext.html

  2. 我也找到了这个解决方案:h**p://www.eclipsezone.com/eclipse/forums/t97690.rhtml

    但我有点失望,我不得不包装每一个方法,而且我不得不使用 Eclipse 特定的 apis

    这个解决方案也有同样的问题:https://stackoverflow.com/a/11034485/1737519 尽管该示例使用的是 apache felix api 而不是 Eclipse api。

我想做的就是像这样访问/引用服务:

Iservice s = ???;
s.foo(<T> bar);

提前感谢您的帮助!

附:抱歉屏蔽链接,但我不能包含超过 2 个!

【问题讨论】:

  • 第二个解决方案与 Eclipse 相关的是什么?特别是 Stackoverflow 链接中的答案准确地显示了如何做到这一点,它不需要任何 Eclipse API。它也不需要“包装每一个方法”,你能解释一下你的意思吗?
  • 哦,对不起,你是对的,stackoverflow 的第二个解决方案不使用 eclipse api。但它使用了 apache felix api org.apache.felix.shell.Command 并且 run 方法实际上被包装在 execute 方法中
  • 它使用 org.apache.felix.shell.Command ,是服务将提供 osgi 控制台命令,在 org.apache.felix.shell.impl.Activator.ShellServiceImpl 将获取所有实现的服务org.apache.felix.shell.Command 接口。
  • 呃,你打错了吗? ServiceImpl 必须实现 IService 才能工作。
  • @user1737519 链接示例only 使用Felix 命令来构建示例。它可能是任何东西;通过执行命令,Christian 展示了一种使用该服务的简单方法。就这样。 execute 方法“包装”了 print 方法,因为它显示了如何调用 print 方法,这正是您所要求的!因此,不要将答案的框架(实际上可能是任何东西)误认为是必要的依赖关系。他们不是。

标签: java eclipse service osgi declarative


【解决方案1】:

这是使用您的服务的一种方式。我发明了一个虚构的计费组件,需要调用您的IService。我没有使用 XML,而是使用 bnd 注释,这更方便:

@Component
public class Billing {

    private IService service;

    @Reference
    public void setService(IService service) {
        this.service = service;
    }

    public void billCustomer() {
         // Do some stuff related to billing, whatever.

         // Blah blah blah

         // Now call the service, even though it wasn't real Java because
         // the <T> type parameter was unbound, but who cares...
         service.foo(bar);

         // Yay.
    }

}

【讨论】:

  • @user1737519,我有一个使用 Neil 在github.com/bdelacretaz/OSGi-for-mere-mortals 中提到的注释的完整示例 - 在一个小型示例项目中查看这些注释可能会有所帮助。
  • 完全正确。但是我读到最好使用 xml 文件:eclipse.org/forums/index.php/mv/msg/266860/766746/#msg_766746
  • @user1737519:那个论坛消息是错误的。这些只是构建时注释,因此运行时成本为零。生成的类文件也可以在 Java 1.4 上运行,只要您将 -target 标志正确地提供给 Java 编译器。
【解决方案2】:

它使用 org.apache.felix.shell.Command ,是服务将提供 osgi 控制台命令,在 org.apache.felix.shell.impl.Activator.ShellServiceImpl 将获取所有实现 org.apache.felix 的服务.shell.Command 接口。所以当用户输入命令名时,ShellServiceImpl 会执行特殊服务。 只要让服务客户知道接口,接口就是服务提供者和服务客户​​之间的契约。

希望,有用!

【讨论】:

  • 你能给我一个代码sn-p吗? (虽然我不允许使用 apache felix apis)
猜你喜欢
  • 2016-08-26
  • 2012-04-27
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2018-05-20
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多