2013-12-24 2 views
0

Я действительно новичок в этом (OSGI), пытаясь сделать простые примеры. Я не могу делать ленивые действия. Я знаю, что там есть несколько идей Blueprint, чтобы решить такие проблемы, но прежде чем приступить к одному, я подумал, что было бы полезно изучить несколько основ.OSGI Bundle Lazy Activation

 

    Bundle DataService: 
    Manifest-Version: 1.0 
    Bundle-Version: 1.0.0 
    Bundle-Name: DataService 
    Bundle-ManifestVersion: 2 
    Bundle-Activator: DataService.Activator 
    Import-Package: org.osgi.framework 
    Bundle-SymbolicName: DataService 
    Export-Package: DataService;version="1.0.0" 
    Bundle-ActivationPolicy: lazy 

    Bundle DataServiceClient: 
    Manifest-Version: 1.0 
    Bundle-Version: 1.0.0 
    Bundle-Name: DataServiceClient 
    Bundle-ManifestVersion: 2 
    Bundle-Activator: DataServiceClient.Activator 
    Import-Package: org.osgi.framework, DataService;version="[1.0.0,1.0.0]" 
    Bundle-SymbolicName: DataServiceClient 

ОК Я изменил свой код, но все равно не повезло.

Внешнее приложение, устанавливает пакеты, запускает фреймворк, а затем запускает набор DataServiceClient. Нет доступа к любому классу пакетов.

 

    File bundleDir = new File("./bundles/"); 
    String[] bundleResources = bundleDir.list(); 
    for(String bundleResourcePath : bundleResources) { 
     File bundleResource = new File(bundleDir, bundleResourcePath); 
     InputStream bs =new FileInputStream(bundleResource); 
     mFramework.getBundleContext().installBundle(bundleResource.getName(), bs); 
    } 
    mFramework.start(); 

    bl = mFramework.getBundleContext().getBundles(); 
    for(Bundle b : bl) { 
     if (b.getBundleId() != 0 && b.getSymbolicName().contains("DataServiceClient")) { 
      b.start(); 
     }   
    } 


Вот начало DataServiceClient:

 

    System.out.println("DataServiceClient Start"); 
    IDataService service = new DummyService(); 
    System.out.println(service.getData()); 



Вот класс DummyService в связке "DataService".

 

    public class DummyService implements IDataService { 

     @Override 
     public String getData() { 
      return "DummyService Data"; 
     } 
    } 

Вот начало "DataService" пачке:

 
    System.out.println("DataService Start"); 

Выход я получаю:

 

    DataServiceClient Start 
    DummyService Data 

Однако я ожидаю увидеть:

 

    DataServiceClient Start 
    DataService Start 
    DummyService Data 

небольшое количество голосов от http://www.osgi.org/Design/LazyStart

Ленивый Активация

Ленивый активации политики жизненного цикла, что предписывает пучок должен быть активирован при первом успешном запросе, чтобы загрузить класс из этого пучка.

Однако, поскольку он не работает, я думаю, я полностью неправильно понимаю концепцию ленивой активации, или я делаю что-то неправильно.

Если я явно не вызываю начало для пакета DataService, похоже, он не вызывает Activator.start для пакета DataService. Это то, чего я не получаю.

Thx за ваше время

ответ

1

Вы уверены, ваш Активатор действительно не называется. У меня часто случалось, что активатор был вызван, но опыт и исключение, которое OSGi проглотил. Можете ли вы попробовать println в первой строке в Activator.start, чтобы проверить это. В этом случае полезен и пробный захват с протоколированием.

КПП. Именование пакета с буквой в верхнем регистре очень необычно. Не уверен, что это проблема, но я бы этого избежал.

+0

Hi Christian, Это просто для обучения атм. Но вы совершенно не согласны с именованием. Однако я не уверен, что приложение получает исключение. В коде нет ничего такого, что могло случиться. – user1934537

+0

Можете ли вы разместить свой полный пример где-нибудь (github или аналогичный)? –

0

Непонятно, что происходит, когда вы вызываете DummyClient.GetData(). Вы говорите, что он вызывает класс в наборе DataService, но как? DataService - это обычный пакет, и ваш код является основным приложением для запуска Java, и в OSGi нет способа, чтобы «внешнее» приложение зависело статически от обычного пакета.

В любом случае, даже если вы могли бы это сделать, вы выполните эту строку кода до пуск запущен. Активатор пучка, конечно, будет , а не называть перед запуском пучка !! Я ожидал бы, что ваш активатор будет вызван по строке 36, т. Е. Вы вызываете bundle.start() на каждый комплект.

Но на самом деле ... что же вы пытаетесь сделать? Флаг Bundle-ActivationPolicy: lazy почти полностью бесполезен. У меня есть восьмилетний опыт OSGi, и я использовал этот параметр только в приложениях RCP Eclipse по причинам, связанным с наследием. Если вы не пишете подключаемый модуль Eclipse или приложение Eclipse RCP, , вы не должны использовать Bundle-ActivationPolicy: lazy в OSGi.

Правильный способ получить ленивый (или «как раз вовремя») экземпляр в OSGi - использовать Declarative Services (DS). Все объекты сервиса, опубликованные DS, создаются по требованию, когда клиент сначала пытается вызвать их, а не во время их регистрации. Для этого вам не нужно ничего особенного.

+0

Hi Neil, Почему ленивая активация бесполезна? Я запустил свой код, но все равно не успел. Это кажется действительно базовой концепцией, но я думаю, что я что-то упускаю. – user1934537

+0

Я не говорил, что ленивая активация бесполезна. Это очень полезно, если вы сделаете это правильно. Я сказал, что флаг «Bundle-ActivationPolicy: lazy» бесполезен. –

0

Что касается измененного кода ... вы никогда не запускаете пул DataServiceClient, поэтому его активатор не может быть вызван. Вы явно исключили его по имени из цикла, в котором вы запускаете пакеты. OSGi всегда будет звонить BundleActivator на пучки, которые были запущены с bundle.start().

Это очень широко ошибочная точка ... OSGi никогда не запускает пучки, даже с флагом Bundle-ActivationPolicy: lazy.

Возможно, что вы хотели сделать, это начать расслоение следующим образом:

bundle.start(Bundle.START_ACTIVATION_POLICY). 

На самом деле вы делаете это для всех пучков, а не произвольно, начиная подмножество расслоений.

Но снова я должен повторить то, что я сделал в своем другом ответе. Использование Bundle-ActivationPolicy: lazy бессмысленно, за исключением случаев, когда вы разрабатываете приложения Eclipse RCP, и в этом случае вам иногда приходится использовать его для глупых унаследованных причин.

+0

на самом деле это только начинается DataServiceClient, но тогда вы правы, кажется, что ленивая активация - это не то, что я думаю. Я предполагаю, что поэтому реализация Blueprint там :) Спасибо за ваше время, очень ценим. – user1934537

+0

Почти правильно ... используйте декларативные услуги, а не план. –

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

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