Я действительно новичок в этом (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 за ваше время
Hi Christian, Это просто для обучения атм. Но вы совершенно не согласны с именованием. Однако я не уверен, что приложение получает исключение. В коде нет ничего такого, что могло случиться. – user1934537
Можете ли вы разместить свой полный пример где-нибудь (github или аналогичный)? –