OSGi声明服务(ds)用法

时间:2012-10-11 09:41:49

标签: java eclipse service osgi declarative

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

不幸的是我无法弄清楚如何访问消费服务。

我的服务如下:

public interface IService {
    public void foo(<T> bar);
}
public class ServiceImpl implemets IService {
    public void foo( bar){
        ...
    }
}
<?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不会找到

    的导入

    ComponentContext h ** 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。

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

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

    Thx提前帮助你!

    P.S。 sry用于屏蔽链接,但我不能包含超过2个!

2 个答案:

答案 0 :(得分:2)

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

}

答案 1 :(得分:0)

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

希望,这很有用!