远程OSGI服务调用

问题描述 投票:0回答:2

还在努力学习OSGI。但是有人可以告诉我这是否可行或者我可能在这个示例代码中出错。

所以我有两个独立的捆绑包在服务组合中运行。

public class Activator implements BundleActivator {

    public void start(BundleContext context) throws Exception {
        context.registerService(Checker.class.getName(), new CheckerImpl(), null);
    }
}

public interface Checker{
    public void checkMe()
}

public class CheckerImpl implements Checker{
    public void checkme(){
        System.out.println("Hello World");
    }
}

bundle上面包含一个名为Checker的接口,它有一个函数runCheck()和一个实现这个接口的类(在这种情况下runCheck()只输出hello world。)

这是“远程”捆绑包。

public class RemoteActivator implements BundleActivator {

 public void start(BundleContext context) throws Exception{
    serviceRef = context.getServiceReference(SVC_REF_CERTCHECK);

    if (serviceRef == null) { 
        logMsg("Servicereference is null");
        throw new NullPointerException();
        }
    else{
        logMsg("Check: " + context.getService(serviceRef).getClass().toString());


        Object svc = context.getService(serviceRef);

        logMsg(svc.toString());

        Checker check = (Checker) svc;

        svc.runCheck();
}

public void logMsg(Object o){
    System.out.println(o);
}
}

public interface Checker{
    public void checkMe()
}

有了这个包,我们有另一个名为Checker的接口(它包含与第一个包中的接口相同的代码)但是每当我运行它时都会进入

Checker check = (Checker) svc;
svc.runCheck();

并停止工作(甚至没有给我一个错误信息)。我知道它收到的对象是我可以运行的其他服务

svc.toString()

它将运行CheckerImpl中的重载方法的代码。

我是否需要在远程调用服务中具有.jar包的依赖关系?

谢谢大家!

java osgi osgi-bundle apache-servicemix
2个回答
2
投票

你有两个Checker接口:每个捆绑一个。这些是由每个bundle的类加载器加载的,因此就VM而言是不同的类。使用该服务实现服务和客户端捆绑包的捆绑包必须共享相同的服务接口类。这就是为什么一个bundle需要导出包含服务接口类的包作为API,而其他bundle需要导入该包。服务建立在类型共享之上。


0
投票

所以我要做的就是不在远程/客户端Bundle中添加新的接口,而是需要将主bundle的依赖项添加到我的pom.xml中。

在主服务类中,我需要确保pom.xml导出所需的包/类。

<Export-Package>
    my.pachage.bundle.*;
</Export-Package>
© www.soinside.com 2019 - 2024. All rights reserved.