2016-10-14 2 views
0

У меня очень простой поставщик услуг и потребитель. По какой-то причине я не могу решить проблему, что мой потребитель будет использовать сервис провайдера. Вот расслоением исходный код поставщика:Состояние неудовлетворенное (справочное) для обслуживания в Карафе - где ошибка? (OSGi, декларативное обслуживание, аннотации)

package test; 

import org.osgi.framework.BundleContext; 
import org.osgi.service.component.ComponentContext; 
import org.osgi.service.component.annotations.Activate; 
import org.osgi.service.component.annotations.Component; 
import org.osgi.service.component.annotations.Deactivate; 

@Component (name = "MyProvider", immediate = true) 
public class TestClass implements SimpleMathI { 

    public TestClass() { 
     System.out.println("contructing TestClass"); 
    } 

    @Activate 
    protected void activate(ComponentContext c, BundleContext b) { 
     System.out.println("activate testClass "); 
    } 

    @Deactivate 
    protected void deactivate() { 
     System.out.println("de-activate testClass"); 
    } 

    @Override 
    public void doSimpleAdd(int x, int y) { 
     System.out.println("Result(TestClass): " + (x + y)); 
    } 

    @Override 
    public void doSimpleSubstract(int x, int y) { 
     System.out.println("Result(TestClass): " + (x - y)); 
    } 
} 

регистрирует компонент MyProvider и услуги test.SimpleMathI (listed in karaf)

Здесь потребитель:

Если я не ссылаться на службу SimpleMathI, но только ConfigurationAdmin работает отлично!

package test; 

import org.osgi.framework.BundleContext; 
import org.osgi.service.cm.ConfigurationAdmin; 
import org.osgi.service.component.ComponentContext; 
import org.osgi.service.component.annotations.Activate; 
import org.osgi.service.component.annotations.Component; 
import org.osgi.service.component.annotations.ConfigurationPolicy; 
import org.osgi.service.component.annotations.Deactivate; 
import org.osgi.service.component.annotations.Reference; 

@Component (name = "MyConsumer", immediate = true, configurationPolicy = ConfigurationPolicy.OPTIONAL) 
public class TestClass2 { 

    public TestClass2() { 
     System.out.println("contructing TestClass2"); 
    } 

    @Reference (bind = "bind", unbind = "unbind") 
    ConfigurationAdmin cm; // works 

    @Reference (bind = "bindSimpleMathI", unbind = "unbindSimpleMathI") 
    SimpleMathI simpleMath; // does not work, see screenshot 

    @Activate 
    protected void activate(ComponentContext c, BundleContext b) { 
     System.out.println("activate testClass2"); 
     // simpleMath.doSimpleAdd(20, 25); 
    } 

    @Deactivate 
    protected void deactivate() { 
     System.out.println("de-activate testClass2"); 
    } 

    protected void bind(ConfigurationAdmin a) { 
     System.out.println("binding"); 
    } 

    protected void unbind(ConfigurationAdmin a) { 
     System.out.println("un-binding"); 
    } 

    protected void bindSimpleMathI(SimpleMathI a) { 
     System.out.println("binding!!"); 
    } 

    protected void unbindSimpleMathI(SimpleMathI a) { 
     System.out.println("un-binding!!"); 
    } 
} 

и здесь выход в Karaf webconsole.

Я достаточно гугл, но все еще не могу понять, что я пропустил. Странно, так как код очень прост и прозрачен. Итак, что я внедрил неверного поставщика или потребителя?

Karaf 4.0.7, не Apache не ФЕЛИКС используются, чистые OSGi R6 декларативные услуги

ответ

0

Я думаю, что вы сделали простую ошибку. В OSGi у вас не должно быть двух пакетов с одним пакетом.

Типичная установка в OSGi должна иметь три пакета:

  • test.api для интерфейса
  • test.impl или test.provider для обслуживания осущ
  • some.other.package для ваш потребительский класс

Вы можете либо поместить как test.api, так и test.impl в один и тот же комплект или иметь отдельный пакет api.

В любом случае потребитель не должен вставлять пакет интерфейса в свой собственный пакет. Вместо этого он должен иметь Import-Package в своем манифесте для пакета api.

+0

ОК, теперь я это понял. Также заметили, что большинство людей используют три подхода к пакету. Это имеет смысл. – neodix

0

Это очень хороший момент, не знал этого. После того как я изменил имя пакета для потребителя на test2, он все еще не смог его решить, потому что он искал службу с test2.SimpleMathI.

Чтобы решить эту проблему, я импортировал проект Eclipse, провайдер с пакетом тестом в проект потребителя и конкретизирован в pom.xml зависимостей в связку провайдера:

<dependency> 
    <groupId>com</groupId> 
    <artifactId>DStestDS</artifactId> 
    <version>0.0.18</version> 
    <type>bundle</type> 
</dependency> 

и модифицировал код потребителя следующим образом:

@Reference (bind = "bindSimpleMathI", unbind = "unbindSimpleMathI") 
test.SimpleMathI simpleMath; 

, но я не уверен, что это правильно ... это как-то связывает меня с этой конкретной версией (18). В manifest.mf я использовал для определения диапазона версий, как это сделать в pom.xml?

wokring screenshot

Спасибо христианкой, вы снова помогли мне.

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