Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理由捆绑包中的服务创建的类的实例?_Java_Osgi - Fatal编程技术网

Java 处理由捆绑包中的服务创建的类的实例?

Java 处理由捆绑包中的服务创建的类的实例?,java,osgi,Java,Osgi,如何处理捆绑包中由服务创建的类的实例?当主机应用程序(带有嵌入式osgi容器的应用程序)保留实例并更新包时,这会导致问题。更新后,有两个版本的类实例。不理想 我找到了几个解决方案: 让bundle负责类实例 让主机应用程序在更新时序列化/反序列化实例 使用反射来访问实例 对所有服务使用不可更改的数据对象(例如hashmap) 在您的情况下(嵌入式OSGi容器),主机应用程序通常包含OSGi服务实现的接口 基于您的最后三个选项,我猜您不想使用新的OSGi服务重新生成实例。如果API位于主机应用程

如何处理捆绑包中由服务创建的类的实例?当主机应用程序(带有嵌入式osgi容器的应用程序)保留实例并更新包时,这会导致问题。更新后,有两个版本的类实例。不理想

我找到了几个解决方案:

  • 让bundle负责类实例
  • 让主机应用程序在更新时序列化/反序列化实例
  • 使用反射来访问实例
  • 对所有服务使用不可更改的数据对象(例如hashmap)
在您的情况下(嵌入式OSGi容器),主机应用程序通常包含OSGi服务实现的接口

基于您的最后三个选项,我猜您不想使用新的OSGi服务重新生成实例。如果API位于主机应用程序中,则无需执行任何操作。实例的类型来自已删除的捆绑包,这无关紧要。只有API才重要。由于您的实例是可序列化的,我想它们不必关闭(关闭某个流或任何东西)

如果希望在每次OSGi服务再次可用时重新生成实例,可以在主机应用程序中实现ServiceTracker,并捕获注册和取消注册OSGi服务的事件


如果您的主机应用程序是一个捆绑包,那么您可以使用声明性服务来实现您的逻辑,这样您就可以避免使用像ServiceTracker这样的低级API。

主机应用程序是什么意思?它也是使用另一个捆绑包的OSGi服务的捆绑包吗?或者主机应用程序有一个嵌入式OSGi容器?@BalazsSoldos主机应用程序确实是一个嵌入式OSGi容器。虽然在遥远的将来它可能会转换为捆绑包,但这仍然是一个太远的改变。服务创建的实例扩展了api,api函数在捆绑包更新后正常工作,问题在于这些实例的添加,例如一个额外的字段。要访问此字段,服务需要将其强制转换为非api接口,并且在捆绑包更新后出现错误(这是有意义的)。我的4个解决方案在很大程度上解决了这个问题,但我一直在寻找更好的方法来处理这种情况。干杯嗯,我还可以将捆绑包的扩展api添加到主机应用程序的systempackages中,然后一切正常。但这意味着,如果扩展api发生更改,我必须重新启动主机应用程序,也不能插入新的捆绑包。如果api发生更改,则必须重新启动主机应用程序。当然,您仍然可以在OSGi框架内添加/删除/更新捆绑包。。。为什么你认为这是不可能的?