2016-10-25 4 views
0

아직도 OSGI를 배우려고합니다. 그러나 누군가가 이것이 가능한지 또는이 샘플 코드에서 잘못 될 수 있는지 알려줄 수 있습니다.원격 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"); 
    } 
} 

번들 상술 한 기능 runCheck() 및

이게 (이 경우 runCheck() 단지 헬로 출력 세계.)에서이 인터페이스를 구현하는 클래스를 갖는다 검사기라는 인터페이스를 포함 "원격"번들 나는 그것이

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

에 도착하고 작동을 중지 실행하지만 때마다 우리는 (1 번들 인터페이스와 같은 코드를 포함) 검사기라는 또 다른 인터페이스를 가지고이 번들로

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

(아무튼 심지어 나에게 오류 메시지를주지 않는다). 내가

svc.toString() 

을 실행할 수 있으며이 CheckerImpl 내 과부하 방법의 코드를 실행할로받은 개체가 다른 서비스입니다 것을 알고있다.

원격 호출 서비스에서 .jar 번들의 종속성이 필요합니까?

감사합니다!

답변

0

그래서 원격/클라이언트 번들에 새 인터페이스를 추가하지 않고 대신 기본 번들의 종속성을 pom.xml에 추가해야합니다.

주 서비스 클래스에서 pom.xml이 필수 패키지/클래스를 내보내도록해야합니다.

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

두 개의 Checker 인터페이스가 각 번들에 하나씩 있습니다. 이것들은 각 번들의 클래스 로더에 의해로드되기 때문에 VM에 관한 한 다른 클래스가됩니다. 서비스를 사용하는 서비스 번들과 클라이언트 번들은이 동일한 서비스 인터페이스 클래스를 공유해야합니다. 따라서 하나의 번들은 서비스 인터페이스 클래스가 포함 된 패키지를 API로 내보내고 다른 번들은 해당 패키지를 가져와야합니다. 서비스는 유형 공유를 기반으로 구축됩니다.