1

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

不幸的是,我无法弄清楚如何访问使用该服务。

我的服务如下所示:

public interface IService {
    public void foo(<T> bar);
}
公共类 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 特定的 api

    此解决方案存在相同的问题:https ://stackoverflow.com/a/11034485/1737519尽管该示例使用 apache felix api 而不是 Eclipse api。

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

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

感谢您提前提供帮助!

PS sry 屏蔽链接,但我不能包含超过 2 个!

4

2 回答 2

2

这是使用您的服务的一种方式。我发明了一个虚构的计费组件,它需要调用你的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.
    }

}

于 2012-10-11T23:37:04.310 回答
0

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

希望,有用!

于 2012-10-11T13:09:19.420 回答