- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在OSGI中,我们可以在运行时更新,激活,停用捆绑软件。
但是我不知道怎么可能,因为其他一些人可能会使用该捆绑软件的功能。为什么这种情况不会使应用程序崩溃?
通常,在JVM中,无论何时运行任何应用程序,它都会加载源类文件和所需的Java API类文件并产生结果。
您能解释一下OSGI的基本架构是什么,以便它允许上述情况发生。
最佳答案
要了解这一点,您需要查看OSGi格局的两个部分:服务和(Java)类/接口。
与服务相关的激活,停用和更新由客户端(用户)与服务提供者之间的合同处理。客户端必须跟踪对可用服务的更改,并在得知要删除该服务后立即释放对服务的使用。此外,一旦更好的服务可用,它就可以跟踪其他服务的可用性以更新其参考。请注意,OSGi环境是一种协作环境:非一个环境会强制使用包实际释放对服务的引用。因此,错误的行为可能导致意外的结果。
这样:对于服务,服务的用户负责处理服务可用性的动态。
与Java类/接口相关,意味着类加载,处理由框架本身完成。卸载为其他捆绑包提供类的捆绑包(通过其Export-Package清单条目宣布)时,捆绑包提供的类仍可用于已在使用它们的捆绑包。只有通过隐式告诉框架更新捆绑包之间的类的连接(通过对org.osgi.service.packageadmin.PackageAdmin
服务的“刷新”操作,通常通过某种框架控制台提供),才能对捆绑包导入的类进行更改。在那种情况下,可以通过框架停用使用包,将其重新连接到由不同包提供的其他类,然后再次激活。
这样:对于类加载,除非明确要求这样做,否则框架不会更改初始接线。对于这些包,必须知道它们可以随时启动,加载,停止和卸载以处理变化的上下文。
也许有些情况使这一点更加清楚:
假设在包LogInterface中有一个接口定义Log
。该接口提供了一种方法:logMessage(String message)
。在此定义旁边,有一个捆绑包LogProvider,提供了接口的实现,而捆绑包则利用了接口LogUser的功能。这三个捆绑软件以捆绑软件和软件包版本1.0.0
的形式在OSGi框架中安装和启动。捆绑包LogProvider在服务注册表中注册日志服务对象,捆绑包LogUser检索该服务对象并对其进行调用以进行日志记录。
场景1 :假定LogProvider软件包已更新,而没有更改接口定义,例如,不仅记录到控制台,而且记录到文件。在这种情况下,必须停止旧的LogProvider捆绑软件(版本1.0.0),并且必须将新的LogProvider捆绑软件(1.1.0)安装到框架中并启动。旧的LogProvider捆绑软件一旦停止,日志服务就会消失,并通知LogUser(必须释放服务对象)。启动新的LogProvider捆绑包后,LogUser捆绑包可以查找并使用LogProvider捆绑包1.1.0提供的新实现。
场景2 :假设接口定义中添加了一种新方法,该方法允许传递严重性代码。这意味着在logMessage(String message)
方法旁边,Log
接口获得了一个新方法logMessage(int severity, String message)
。由于接口更改,因此将卸载捆绑LogInterface版本1.0.0,并安装并启动捆绑LogInterface版本1.1.0。当然,LogProvider捆绑包也必须更改以提供新方法的实现,因此必须安装并启动LogProvider版本1.3.0。
在这种情况下,卸载LogProvider 1.2.0并启动LogProvider版本1.3.0不会导致LogUser能够检索新提供的服务。这是因为LogProvider 1.3.0从LogInterface捆绑软件1.1.0中加载了Log接口的定义,并从LogInterface捆绑软件1.0.0中加载了LogUser。要将LogUser更新到新的接口版本,必须对LogUser捆绑软件进行捆绑刷新。在实践中,执行此“刷新”意味着LogUser捆绑包将停止,重新连接到新的LogInterface版本1.1.0捆绑包并重新启动。
关于java - 我们如何在运行时更新OSGI中的任何捆绑软件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21228056/
前言 在进行Maven开发时,往往需要下载大量jar包,而由于网络不稳定等其他因素可能导致jar未下载完毕,然后保留了lastUpdated文件,导致无法更新失效的jar包。 本文分享 bat脚本,自
按字母顺序排序并不是我们花太多时间担心的事情。我们在很小的时候就学习了字母表,现在我们知道它(拉丁文)以 A 开头,然后是 B,然后是 C 等等,一直到 Z。 但是这个订单究竟存储在计算机系统中的什么
我尝试使用可分离为 2 个一维向量的二维矩阵来证明二维傅里叶变换的信号属性的可分离性。地点: f(x,y) = f(x)*f(y) 那么 F(u,v) = F(u)*F(v) 使用以下代码: % Se
我需要为几个小型sqlite数据库编写文档。想描述数据的使用方式,包括表和行说明以及示例数据。 是否可以使用MySQL Workbench?如果没有其他选择,或者我可以使用任何模板? TIA! 最佳答
我正在尝试使用旧版本(例如:1.4.5)安装 memcached,但我不知道该怎么做。 brew install memcached安装最新的。 我也试过 brew install memecache
背景 多年来,我一直使用自己的类似贝叶斯方法,根据大型且不断更新的训练数据集对来自外部来源的新项目进行分类。 每个项目都有三种类型的分类: 30 个类别,其中每个项目必须属于一个类别,且最多属于两个类
嗨,我需要确定 4 个数字是否相等。数字是 size(A,1)、size(B,1)、size(C,1) 和 size(D,1),其中,例如A = [1 2; 3 4], B=[1 2 3, 4 5 6
Wikipedia 中的文章似乎太冗长了。 我将框架理解为一组精心设计的库和工具。 Qt 框架为跨平台 GUI 提供了一组库/工具。 cocoa 框架为 Mac 做了同样的事情。 软件框架的实际定义是
我们的客户最近发现了这个网站: http://mydeco.com/3d-planner/ 它有一个非常非常奇特且组合良好的 3d CAD Web 应用程序,似乎是使用 jQuery 编写的,而不是
我们正在寻找一种独立的(非 cms)日历解决方案来显示在网络上。它可以是开源的或付费服务。 我们主要是在寻找一种在 Web 上显示日历的方法,其中包含事件发生的时间和事件的名称。如果它可以按周、月、年
我想知道与软件相关的“质量保证”和“质量科学”之间的区别。 我在Google上进行了研究,但未找到有关“质量科学”的任何信息。 最佳答案 Based on the link you have prov
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我有一个由 2 个方程和 2 个未知数组成的系统,我想使用 MATLAB 求解,但不知道如何编程。我得到了一些有关 Gamma 分布的信息(平均值为 1.86,90% 的间隔介于 1.61 和 2.1
给定一个矩阵,其中 1 是当前子集 test = 0 0 0 0 0 0 0 0 0 0 0 0
我在组合 Matlab“数据”变量的重复元素时遇到问题。我可以使用 unique 和 sort 轻松组合这些值。 [sorted,idx] = sort(data); [~,ij] = unique(
我在做的问题中有这么一段代码,如下图。定义部分只是为了向您展示数组的大小。下面我粘贴了矢量化版本 - 它慢了 2 倍以上。为什么会这样?我知道如果矢量化需要大的临时变量,我就会发生,但(看起来)这里不
我有一个 3D 矩阵,我想将它的每个 2D 分量存储在另一个 2D 矩阵的行中,该 2D 矩阵有许多行作为 3D 矩阵的第 3 维。 我该怎么做? 最佳答案 与 permute & reshape -
如果计算机能够使用纯 JavaScript(Google V8)、C++(Windows、Mac OS 和 Linux)运行程序/软件而没有任何性能问题,是否有任何好的方法可以通过要求尽可能少尽可能从
我的团队的任务是将用于播放媒体文件的全屏、信息亭式应用程序从 Windows 迁移到嵌入式 ARM Linux(瘦客户端)。我们需要在 sd/1080p 中支持 mpeg-2 播放以及 HTML、SW
我们有数以千计的具有白色或黑色或渐变背景的产品图片。我们正在寻找可以去除图片背景的软件或服务。我们需要一款能够很好地完成这项工作的智能软件。 最佳答案 在 photoshop 中,您可以记录 Acti
我是一名优秀的程序员,十分优秀!