gpt4 book ai didi

java - 远程 OSGI 服务调用

转载 作者:行者123 更新时间:2023-12-02 03:16:20 25 4
gpt4 key购买 nike

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

所以我有两个单独的 bundle 在服务组合中运行。

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");
}
}

上面的包包含一个名为 Checker 的接口(interface),它有一个函数 runCheck()和一个实现此接口(interface)的类(在本例中 runCheck() 仅输出 hello world。)

这是“远程” bundle 。

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()
}

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

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

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

svc.toString()

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

我是否需要在远程调用服务中依赖 .jar 包?

谢谢大家!

最佳答案

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

关于java - 远程 OSGI 服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40238570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com