Я недавно начал работу над инфраструктурой OSGi. У меня есть один пучок по имени Bundle-A. Я хочу назвать один из методов в банке Bundle-A из моего основного приложения.Как вызвать один из методов в файле JAR-файла Bundle-A после его установки в контейнер OSGi
Я загрузил и установил Bundle-A из своего основного приложения. Ниже мой код для моего основного приложения, где я устанавливаю Bundle-A.
private void initializeModelFramework() {
try {
FileUtils.deleteDirectory(new File("felix-cache"));
FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
Framework framework = frameworkFactory.newFramework(new HashMap<String, String>());
framework.start();
BundleContext bundleContext = framework.getBundleContext();
modulesNameVersionHolder.put("Bundle-A", "1.0.0");
List<Bundle> installedBundles = new LinkedList<Bundle>();
String basePath = "C:\\ClientTool\\LocalStorage";
for (Map.Entry<String, String> entry : modulesNameVersionHolder.entrySet()) {
String version = entry.getValue();
final String filename = name + Constants.DASH + version + Constants.DOTJAR;
final String localFilename = GoldenModulesConstants.FILE_PROTOCOL + basePath+ File.separatorChar + filename;
installedBundles.add(bundleContext.installBundle(localFilename));
}
for (Bundle bundle : installedBundles) {
bundle.start();// this will start bundle A
}
// After starting the Bundle-A, now I need to call one of the methods in Bundle-A
for(int i=0; i<=10; i++) {
//call processingEvents method of Bundle-A class GoldenModelFramework
}
} catch (Exception e) {
e.printStackTrace();
}
Теперь запущен Bundle-A. Ниже приведен класс Activator для Bundle-A.
public class Activator implements BundleActivator {
private static final String BUNDLE_VERSION_KEY = "Bundle-Version";
private static Logger s_logger = Logger.getLogger(Activator.class.getName());
@Override
public void start(BundleContext context) throws Exception {
final Bundle bundle = context.getBundle();
final String bundleName = bundle.getSymbolicName();
final String bundleVersion = (String) bundle.getHeaders().get(BUNDLE_VERSION_KEY);
System.out.println(bundleName+" - "+bundleVersion);
}
@Override
public void stop(BundleContext context) throws Exception {
System.out.println("Bye.!");
}
}
И ниже класс, который у меня есть в банке Bundle-A. Мне нужно вызвать метод из моего вышеуказанного основного кода приложения, как только Bundle-A был запущен.
public class GoldenModelFramework {
private static final Logger LOGGER = Logger.getLogger(GoldenModelFramework.class.getName());
private static final long checkingAfterEveryXMinutes = 15L;
public GoldenModelFramework() {
// following the traditions
}
public static void processingEvents(final String item) {
for (BundleRegistration.HolderEntry entry : BundleRegistration.getInstance()) {
final String response = entry.getPlugin().process(item);
System.out.println(response);
}
}
}
Я не уверен, что это правильный способ сделать это? Я знаю, что одним из способов является добавление зависимости этого Bundle-A в моем основном файле pom.xml приложения, поскольку я использую проект на основе maven. Но я не думаю, что это правильный способ сделать это. Потому что, в конечном счете, у меня появятся еще несколько пучков, поэтому для этого я должен быть каким-то другим способом, о котором я не знаю.
Должен ли я использовать ServiceListener или ServiceTracker здесь? Любая простая примерная основа моего кода поможет мне понять намного лучше. Благодарю.
Надеюсь, вопрос достаточно ясный. Я пытаюсь вызвать один из методов в Bundle-A после его загрузки и установки.
Возможно, вам будет намного лучше начать с более удобного уровня, теперь вы пытаетесь запустить, прежде чем сможете сканировать. Самый простой способ начать работу с bndtools. Это хорошее место для начала: http://bndtools.org/tutorial.html –