簡體   English   中英

遠程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的接口,該接口具有一個函數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捆綁包的依賴項?

謝謝大家!

您有兩個Checker接口:每個捆綁中有一個。 這些由每個捆綁軟件的類加載器加載,因此就VM而言是不同的類。 實現該服務的捆綁包和使用該服務的客戶端捆綁包必須共享相同的服務接口類。 這就是為什么一個捆綁軟件需要將包含服務接口類的軟件包導出為API,而其他捆綁軟件則需要導入該軟件包。 服務建立在類型共享之上。

因此,我要做的是不在遠程/客戶端捆綁包中添加新接口,而是需要將主捆綁包的依賴項添加到pom.xml中。

在主服務類中,我需要確保pom.xml導出所需的包/類。

<Export-Package>
    my.pachage.bundle.*;
</Export-Package>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM