我最近開始使用OSGi框架。我有一個名爲Bundle-A的包。我想從我的主應用程序中調用Bundle-A jar中的一個方法。如何在安裝到OSGi容器中之後調用我的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的Activator類。
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中的類。一旦Bundle-A啓動,我需要從我的上述主應用程序代碼中調用processingEvents
方法。
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後調用其中一種方法。
從更方便的級別開始,您可能會好得多,現在您正在嘗試運行,然後才能抓取。最簡單的方法就是使用bndtools。這是一個很好的開始:http://bndtools.org/tutorial.html –