现在我尝试将我的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>
就我现在而言。
但我该如何访问该服务?
但是eclipse不会找到
的导入 ComponentContext
h ** p://www.osgi.org/javadoc/r4v42/org/osgi/service/component/ComponentContext.html
我也找到了这个解决方案: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);
Thx提前帮助你!
P.S。 sry用于屏蔽链接,但我不能包含超过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将执行特殊服务。 只需让服务客户知道界面,界面就是服务提供商和服务客户之间的契约。
希望,这很有用!