如果另一个提供服务的捆绑包更新Java,为什么不通知/刷新依赖捆绑包?

时间:2017-05-19 06:21:24

标签: java osgi

我有2个OSGI捆绑包TestCommons,它们是服务提供者捆绑包和使用该服务的TestMyBundle。 现在我在testMyBundle中使用了Declarative服务,并基于我在TestMyBundle的Activator类中设置和取消设置。因此,只要找到TestCommons服务,就会调用setter方法,如果从OSGI取消注册TestCommons服务,则调用unsetter。

现在我想以编程方式更新TestCommons包,我使用org.osgi.framework.Bundle接口的update()方法来更新现有的包。 现在,如果我更新bundle,则不会调用Bundle TestMyBundle的setter和unsetter方法,并且不会通知bundle。如何以编程方式通知更新的从属捆绑包? 一种方法是刷新,但我无法手动刷新包。

这是我写的代码

Bundle[] bundle = context.getBundles();
    String symbolicName = "TestCommons";
    try {
        FrameworkWiring frameworkWiring = null;
        for (Bundle b : bundle) {
            if (b.getSymbolicName().equalsIgnoreCase(symbolicName)) {
                b.update(new FileInputStream(new File("/home/temp/TestCommons-0.0.1-SNAPSHOT.jar")));
                frameworkWiring = context.getBundle().adapt(FrameworkWiring.class);
                break;
            }

        }
        frameworkWiring.refreshBundles(null);
    } catch (Exception e) {
        System.out.println("Exception occured while starting...");
        e.printStackTrace();
    }

}

现在,adapt()方法返回null。因此无法调用刷新。请更新我这里的问题以及可以采取哪些其他方法来实现捆绑更新。

任何线索都会受到赞赏。感谢...

1 个答案:

答案 0 :(得分:2)

您的TestMyBundle未更新,因为服务的接口包已更新。因此,您已经走上了正确的轨道,需要刷新TestMyBundle以获取更改。

在实践中,您通常可以通过为api使用单独的包来避免这种情况。只要您不更新服务接口 - 而且应该很少 - 您只需更新服务包,客户端中的声明性服务组件就会获取新服务。

现在关于刷新包。您已经正确地需要FrameworkWiring,但只有系统包可以适应FrameworkWiring。所以这应该可以解决问题:

Bundle systemBundle = context.getBundle(0);
systemBundle.adapt(FrameworkWiring.class).refresh(null);

这将刷新所有捆绑包。