2016-01-22 1 views
1

Я новичок в Apache Karaf, я развертываю простой пакет, который печатает дату, когда она запущена. Я достиг этого, используя класс Activator, и он вызывает метод запуска Activator и печатает дату. Я читал, что есть еще один способ, которым я могу достичь этого без Activator и используя план регистрации моего сервиса.Apache Karaf bundle registration-listener registration-method никогда не срабатывает

Я написал сверток и развернул его в Karaf контейнере, но не печатать дату, она даже не вызывает метод регистра, как описано ниже:

<blueprint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
       xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 
     <bean id="timeGreetServiceImpl" class="com.cengage.wiring.TimeGreetServiceImpl"> 
      <argument ref="timeService"/> 
      <argument ref="sampleService"/> 
     </bean> 
     <bean id="serviceLaunch" class="com.cengage.wiring.ServiceLaunch"></bean> 
     <reference id="sampleService" activation="eager" availability="mandatory" interface="com.cengage.api.SampleService"> 
     </reference> 
     <reference id="timeService" activation="eager" availability="mandatory" interface="com.cengage.register.api.SimpleTimeService"> 
     </reference> 
     <service id="timeGreetService" interface="com.cengage.wiring.TimeGreetService" ref="timeGreetServiceImpl"> 
      <registration-listener ref="serviceLaunch" registration-method="register" unregistration-method="unregister"/> 
     </service> 
    </blueprint> 

Это мой класс POJO, который имеет зарегистрированный метод

public class ServiceLaunch { 

    public void register(final TimeGreetService service) { 
     System.out.println("TimeGreetService registered - output: " 
       + service.print()); 
    } 

    public void unregister() { 

    } 
} 

Может кто-нибудь, пожалуйста, сообщите мне, что мне не хватает? В Karaf нет ошибок или журналов.

Спасибо

Попытка 2: Как было предложено в комментариях я изменил свой план, чтобы, но он до сих пор никогда не попадает в метод регистра

решение
<blueprint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
         xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 
<bean id="timeGreetServiceImpl" class="com.cengage.wiring.TimeGreetServiceImpl"> 
    <argument ref="timeService"/> 
    <argument ref="sampleService"/> 
</bean> 
<bean id="serviceLaunch" class="com.cengage.wiring.ServiceLaunch"></bean> 
<reference id="sampleService" activation="eager" availability="optional" interface="com.cengage.api.SampleService"> 
</reference> 
<reference id="timeService" activation="eager" availability="optional" interface="com.cengage.register.api.SimpleTimeService"> 
</reference> 
<service id="timeGreetService" interface="com.cengage.wiring.TimeGreetService" ref="timeGreetServiceImpl"> 
    <registration-listener ref="serviceLaunch" registration-method="register" unregistration-method="unregister"/> 
</service> 
</blueprint> 
+0

Прошу игнорировать мой первый ответ. Я думал, что вы ссылаетесь на ту же службу, которую публикуете. Это не так, поэтому необязательно. –

+0

Вы можете изучить услуги в karaf, используя сервис: list command. Оказывает ли это услуги, от которых вы зависите, а может быть и от службы, которую вы публикуете? –

+0

Возможно, проблема в том, что вы пытаетесь зарегистрировать службу как тип 'TimeGreetService', но ваш класс не реализует' TimeGreetService'. Также почему вы заботитесь о точном времени регистрации вашего собственного сервиса? Почему бы не пойти на простой способ активации? –

ответ

1

Попробуйте удалить регистратор. Затем вы можете проверить, зарегистрирована ли служба, используя команду karaf service: list.

Вы можете использовать атрибуты init-method и destroy-method для получения обратного вызова при инициализации класса службы. Я никогда не видел регистрационного слушателя во всех реальных проектах, которые я видел до сих пор. Так что, вероятно, вам это не понадобится.

Если вам нужно больше примеров чертежей, взгляните на karaf-tutorials.

<blueprint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
      xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 
    <bean id="timeGreetServiceImpl" class="com.cengage.wiring.TimeGreetServiceImpl"> 
     <argument ref="timeService"/> 
     <argument ref="sampleService"/> 
    </bean> 
    <bean id="serviceLaunch" class="com.cengage.wiring.ServiceLaunch"></bean> 
    <reference id="sampleService" activation="eager" availability="mandatory" interface="com.cengage.api.SampleService"> 
    </reference> 
    <reference id="timeService" activation="eager" availability="mandatory" interface="com.cengage.register.api.SimpleTimeService"> 
    </reference> 
    <service id="timeGreetService" interface="com.cengage.wiring.TimeGreetService" ref="timeGreetServiceImpl"/> 
</blueprint> 
+0

Большое вам спасибо! – alyn000r

1

The Blueprint, кажется, весьма запутанным, чтобы достичь что должно быть простой целью: регистрация службы и получение обратного вызова при активации.

Вот пример кода в декларативных Services, который делает то, что я верю, что вы пытаетесь сделать:

@Component 
public class TimeGreetServiceImpl implements TimeGreetService { 

    @Activate 
    void activate() { 
     System.out.printf("TimeGreet service registered, time now is %s%n", printTime()); 
    } 

    @Override 
    public String printTime() { 
     // ... 
    } 

} 

Обратите внимание, что при запуске этого, ваш компонент не будет активирован до тех пор, потребитель услуг не пытается использовать услуга TimeGreetService. Это потому, что DS по умолчанию ленив. Если хотите, вы можете изменить это, поставив immediate=true в атрибуты аннотации @Component.

+0

Привет, спасибо за ответ. Тем не менее, я пытаюсь изучить метод чертежа, потому что это то, что используется в моей работе. Я буду исследовать этот метод, хотя вы знаете какой-либо учебник, который объясняет это? Также не имеет значения, в какое время это всего лишь пример, который я следовал. – alyn000r