OSGI:如何更新消费者'束

时间:2014-11-15 00:11:55

标签: eclipse osgi equinox

我一直试图了解一个奇怪的OSGI行为。希望有人可以对此有所了解。这是我的设置

1)使用eclipse \ plugins \ org.eclipse.osgi_3.7.0.v20110613.jar

2)我有一个导出服务的Bundle(HelloworldService)

它在激活器中注册服务

    public void start(BundleContext context) throws Exception {

        IHelloService helloService = new HelloServiceImpl();
        helloServiceRegistration =context.registerService(
                                  IHelloService.class.getName(), helloService, null
);


    }

3)我有一个'消费者'套装,通过ServiceTracker

使用该服务

        ServiceReference externalServiceReference = Activator.getContext().getServiceReference(IHelloService.class.getName());
        IHelloService externalService = (IHelloService) Activator.getContext().getService(externalServiceReference);

现在我将这两个jar部署到OSGI(helloworld.jar和helloworldservice.jar);它工作正常。我能够得到一个'IHelloService'inmpl对象并对其进行调用。我可以开始/停止捆绑,当他们回来时;它运作得很好

当我'卸载'然后'安装'HelloWorldservice包时会出现问题。 在这种情况下; 'Helloworld'消费者externalServiceReference为NULL。 如果我查看捆绑信息;我看到了这个


osgi> bundle 1
mypackage.helloworld_1.0.0.qualifier [1]
  Id=1, Status=RESOLVED    Data Root=C:\Users\\dev\eclipse\plugins\configuration\org.eclipse.obundles\1\data
  No registered services.
  No services in use.
  No exported packages
  Imported packages
    mypackage.helloworldservice; version="0.0.0" **stale**
    org.osgi.framework; version="1.6.0"
    org.osgi.util.tracker; version="1.5.0"
  No fragment bundles
  Named class space
    mypackage.helloworld; bundle-version="1.0.0.qualifier"[provided]
  No required bundles

请注意,其“导入的套餐”已为GONE STALE。这是有问题的行

导入的包     mypackage.helloworldservice;版本= “0.0.0” <的陈旧>

现在我可以通过从控制台发出'update'命令来解决这个问题。

这是我的问题

1)我如何以编程方式从我的“消费者”包中进行此操作。 2)如果我在生产系统上并且部署了helloworlservice.jar的新“副本”(替换现有版本);我是否必须更新所有用户..我认为ServiceTracker会立即为我提供服务

由于

1 个答案:

答案 0 :(得分:2)

使用者捆绑包从服务jar导入mypackage.helloworldservice包。卸载服务jar时,使用者jar仍然从已卸载的服务jar连接到现在过时的软件包。当您安装新的服务jar时,它会导出一个新的"副本" mypackage.helloworldservice包(我怀疑服务jar也没有导入mypackage.helloworldservice包)。因此,您需要刷新使用者jar,以便将其连接到新的mypackage.helloworldservice包。