我一直试图了解一个奇怪的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会立即为我提供服务
由于
答案 0 :(得分:2)
使用者捆绑包从服务jar导入mypackage.helloworldservice包。卸载服务jar时,使用者jar仍然从已卸载的服务jar连接到现在过时的软件包。当您安装新的服务jar时,它会导出一个新的"副本" mypackage.helloworldservice包(我怀疑服务jar也没有导入mypackage.helloworldservice包)。因此,您需要刷新使用者jar,以便将其连接到新的mypackage.helloworldservice包。