2016-10-25 3 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"); 
    } 
} 

Расслоение Над содержит интерфейс под названием Checker, который имеет одну функцию runCheck() и класс, который реализует этот интерфейс (где в этом случае runCheck() просто выводит привет мир.)

Это «пульт».

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 (который содержит один и тот же код, что и интерфейс в 1 пачке), однако всякий раз, когда я бегу он добраться до

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

и перестать работать (Безразлично даже не сообщите мне сообщение об ошибке). Я знаю, что объект он получил в другом сервисе, как я могу запустить

svc.toString() 

и он будет работать код из метода перегрузки в пределах CheckerImpl.

Нужно ли иметь зависимость от .jar-пакета в службе удаленного вызова?

Спасибо всем!

ответ

0

Итак, что я должен был сделать, это не добавить новый интерфейс в удаленном/клиентском Bundle, и вместо этого мне нужно добавить зависимость основного пакета к моему pom.xml.

в главном классе сервиса Мне нужно убедиться, что pom.xml экспортирует необходимые пакеты/классы.

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

У вас есть два интерфейса Checker: по одному в каждом комплекте. Они загружаются загрузчиком классов каждого пакета и, таким образом, являются разными классами в отношении виртуальной машины. Пакет, реализующий службу и пакеты клиентов с использованием службы , должен использовать один и тот же класс интерфейса службы. Вот почему одному пакету необходимо экспортировать пакет, содержащий класс интерфейса службы, как API, а другие пакеты должны импортировать этот пакет. Услуги основаны на распределении типов.

 Смежные вопросы

  • Нет связанных вопросов^_^