远程 OSGI 服务调用
Remote OSGI Service call
仍在努力学习 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");
}
}
上面的包包含一个名为 Checker 的接口,它有一个函数 运行Check()
和实现此接口的 class(在本例中 运行Check() 仅输出 hello world。)
这是 "remote" 捆绑包。
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 包吗?
谢谢大家!
您有两个 Checker
接口:每个包中一个。它们由每个包的 class 加载程序加载,因此就 VM 而言是不同的 classes。实现服务的 bundle 和使用服务 的客户端 bundle 必须 共享相同的服务接口 class。这就是为什么一个 bundle 需要将包含服务接口 class 的包导出为 API 而其他 bundle 需要导入该包的原因。服务建立在类型共享之上。
所以我打算做的不是在远程/客户端包中添加新接口,而是我需要将主包的依赖项添加到我的 pom.xml。
在主服务中 class 我需要确保 pom.xml 导出所需的包 / classes.
<Export-Package>
my.pachage.bundle.*;
</Export-Package>
仍在努力学习 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");
}
}
上面的包包含一个名为 Checker 的接口,它有一个函数 运行Check() 和实现此接口的 class(在本例中 运行Check() 仅输出 hello world。)
这是 "remote" 捆绑包。
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 包吗?
谢谢大家!
您有两个 Checker
接口:每个包中一个。它们由每个包的 class 加载程序加载,因此就 VM 而言是不同的 classes。实现服务的 bundle 和使用服务 的客户端 bundle 必须 共享相同的服务接口 class。这就是为什么一个 bundle 需要将包含服务接口 class 的包导出为 API 而其他 bundle 需要导入该包的原因。服务建立在类型共享之上。
所以我打算做的不是在远程/客户端包中添加新接口,而是我需要将主包的依赖项添加到我的 pom.xml。
在主服务中 class 我需要确保 pom.xml 导出所需的包 / classes.
<Export-Package>
my.pachage.bundle.*;
</Export-Package>