我最近开始研究 OSGi 框架。我有一个名为 Bundle-A 的捆绑包。我想从我的主应用程序中调用 Bundle-A jar 中的一种方法。
我已经从我的主应用程序加载并安装了 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 已经启动。下面是我的 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 jar 中的类。processingEvents
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);
}
}
}
我不确定正确的方法是什么?我知道一种方法是在我的主应用程序 pom.xml 文件中添加这个 Bundle-A 的依赖项,因为我正在使用基于 maven 的项目。但我不认为这是正确的做法。因为最终,我将有更多的捆绑包,所以应该有一些其他的方法来解决这个问题,我不知道。
我应该在这里使用 ServiceListener 或 ServiceTracker 吗?基于我的代码的任何简单示例都将帮助我更好地理解。谢谢。
我希望这个问题足够清楚。我试图在 Bundle-A 加载和安装后调用其中的一种方法。