刷新包装包

时间:2018-11-22 18:44:57

标签: osgi apache-felix embedded-osgi

我偶然发现了一个问题,可以总结如下:

我有一个嵌入OSGI的应用程序。在此OSGI容器中,我安装了版本v1的捆绑软件A,用于注册该服务对象。主机应用程序使用此服务对象。在使用服务对象时,我卸载了捆绑软件A,并安装了捆绑软件A的新版本(v2)。这是我的发现。

  • 即使我们卸载捆绑软件A(v1),旧服务对象也能正常工作。
  • 新服务对象提供了捆绑软件A(v2)的新功能。

我的问题是,当我们使用

刷新捆绑包时
List<Bundle> refreshbundles = new ArrayList<Bundle>();
Bundle local; // points to the bundle
refreshbundles.add(local);
m_felix.adapt(FrameworkWiring.class).refreshBundles(refreshbundles)

,并且当我们尝试通过新版本的捆绑软件A注册服务对象时,它返回null。我尝试查看源代码,但没有帮助。你能帮我吗?

编辑:

HostApplication

public Felix m_felix = null;
m_felix = new Felix(config); //sending some config to felix.
m_felix.start();

//installing bundle
Bundle bundle = m_felix.getBundleContext().installBundle("file:/bundleA-1.0.jar")    
bundle.start()

//getting the service object registered by bundle A.
ServiceReference sr = m_felix.getBundleContext()
                        .getServiceReference(SampleInterface.class.getName()))
(SampleInterface) m_felix.getBundleContext(sr).getService().sayHI();

//now uninstalling the bundle installing the new version of it say version 1.1
bundle.uninstall()
bundle = m_felix.getBundleContext().installBundle("file:/bundleA-1.1.jar")    
bundle.start()

//getting the service object registered by bundleA1.1

ServiceReference sr = m_felix.getBundleContext()
                    .getServiceReference(SampleInterface.class.getName()))
(SampleInterface) m_felix.getBundleContext(sr).getService().sayHI();

//the above line is working fine but after refreshing the packages, Service object is returned as null    

List<Bundle> refreshbundles = new ArrayList<Bundle>();
Bundle bundle; // points to the bundle
refreshbundles.add(bundle);
m_felix.adapt(FrameworkWiring.class).refreshBundles(refreshbundles)

//refresh done
ServiceReference sr = m_felix.getBundleContext()
                    .getServiceReference(SampleInterface.class.getName()))
(SampleInterface) m_felix.getBundleContext(sr).getService().sayHI();

//throwing null pointer exception because getService() is returning null.

当我们刷新捆绑包时到底发生了什么?

BundleA_Activator.java

public class BundleA_Activator extends BundleActivator{
   public class BundleActivatorInterfaces implements  BundleActivator{
    ServiceRegistration SR;
    @Override
    public void start(BundleContext bundleContext) {

        SR = bundleContext.registerService(SampleInterface.class.getName(), new ExposedClass(), null);
    }

    @Override
    public void stop(BundleContext bundleContext) {
            SR.unregister();
    }
}

0 个答案:

没有答案