问题标签 [declarative-services]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
osgi - OSGi 中的按上下文服务
我正在设计一个应用程序,其功能需要在不同的上下文中相同。让我们参考下图:
有4个捆绑包:
- 上下文管理器
- B1
- B2
- B3
上下文管理器是负责了解新上下文何时可用并实例化B1、B2和B3的新版本的包。B2和B3提供的服务在上下文中完全相同,只是我想在服务上添加一个属性以区分它在哪个上下文中运行(例如 ctx1 与 ctxN)。现在这是我想要实现的理论,我认为我可以通过声明式服务轻松实现它,实际上我通过在组件标题中指定 component.factory 属性使B1 * B2 * 和B3成为ComponentFactory ,并且我设置B1引用B2提供的服务,我也将B2设置为引用B3提供的服务。这些是我面临的挑战:
- 上下文管理器第一次了解到只有B3提供的ComponentFactory服务,只要B1和B2还不满足,他们就不会在服务注册表中注册ComponentFactory服务。只要是这种情况,B1和B2就不会为第一个上下文实例化。
- B1和B2一旦创建,从其他上下文获取任意服务,我正在考虑将 reference.target 参数设置为仅从同一上下文中选择服务,但似乎没有任何方法可以声明性地执行此操作,看起来像从同一上下文中选择服务的唯一方法是设置基数为0..n的引用并提供基于当前上下文进行选择的“绑定”方法,这意味着每个组件都必须复制相同的选择逻辑相反,我认为可以在调用 newInstance 时由上下文管理器提供。实际上如果在调用ComponentFactory.newtInstance(props);我可以提供像 .target=(context=mycontext) 这样的属性,然后可以实现,但我不知道组件实际使用的所有引用。
在这一点上,我正在考虑实际上避免使用声明式服务并让每个上下文包扩展一个我将提供的基类,它将基本上实现类似于 org.apache.felicy.dependencymanager 的依赖项跟踪,但这样的开发人员每个上下文组件不必担心知道代码位于哪个上下文中。但是我不想恢复到这个解决方案,我觉得我只是在复制 OSGi 规范中可能已经存在的逻辑,所以我的问题是:
在 OSGi 中创建可以在每个上下文基础上运行的包的最佳方法是什么,这样包可以以声明性方式描述依赖关系,而不必明确提及它们运行的上下文?
osgi - 如何声明对 SCR 扩展器能力的要求?
OSGi Enterprise Release 5 规范引入了osgi.extender
命名空间。这个命名空间使得假设 Blueprint 或 Declarative Services 等扩展器安装在框架中的捆绑包可以使用Require-Capability
标头对这种依赖关系进行建模。
第 135.2 章osgi.extender 命名空间告诉我们,每个特定扩展器的能力值应该在相应的规范中指定。以蓝图为例:
但是,第 112 章声明性服务规范没有指定 SCR 实现提供的功能。
Peter Kriens 在一篇关于需求和能力的博客文章中给出了一个例子,表明 SCR 的能力是osgi.component
. 我假设最终这个值将在规范中正确定义。但在那之前我不能使用它。
由于Require-Capability
和Provide-Capability
标头是在 OSGi 核心版本 4.3 中引入的,因此该机制已经在框架实现中可用。所以,我希望我的包表达对 SCR 的要求,以便可以从 OBR 存储库中解析 SCR 实现。
我可以想象一个解决方案,我创建一个空包,一方面提供自定义功能,另一方面需要实现包。例如:
然后,任何包含声明性服务的捆绑软件都可以表达对此功能的需求。例如:
当我部署包含声明性服务的包时,这是确保解决 SCR 的好方法吗?还有其他方法吗?
这个问题的一个好的解决方案是一个也可以应用于其他不提供功能的遗留包的解决方案。
osgi - 在给定包中引用 OSGi DS 的最佳实践
我的要求: 我有一项服务可以处理我的项目的持久性。让我将此服务称为 PersistenceProvider 服务,并假设它位于“my.persistenceservice”包中。
现在,我有另一个名为“my.persitenceconsumer”的包,它使用名为 MyPersistenseConsumer 的类之一的 bind() unbind() 方法引用 PersistenceProvider 服务。因此,当“my.persistenceconsumer”捆绑启动时,它将使用 bind() 方法获取 PersistenceProvider 服务的引用,并且 MyPersistenceConsumer 可以使用 PersistenceProvider 服务
但是,我还需要从“my.persitenceconsumer”包中的不同类中使用这个 PersistenceProvider 服务。
我的问题是: 在不同的类中使用这种共享服务的最佳方式是什么(在同一个包中)
解决方案之一: 我可以在“my.persitenceconsumer”包中添加 Activator 类 .. 具有静态 getInstance() 方法。可以由 MyPersistenceConsumer.bind() 调用并将 PersistenceProvider 与 Activator 一起存储。后面“my.persitenceconsumer”包中的所有类都可以通过 Activator 类使用 PersistenceProvider。
这是代码:
最后: 以上是好方法..还是有更好的方法?
osgi - Eclipse RCP 4 通过声明式服务使用包
我已经编写了一个 OSGi 包以在我的 eclipse 4 rcp 应用程序中使用它。如果我添加依赖项,在我的激活器中注册这些服务并将其注入我的类中,则服务的使用工作正常。
在活化剂中
在我的课上
我读到通过声明性服务使用捆绑包应该是更好的方法。所以改变了我的实现。我在我的包中创建了一个组件定义来提供我的服务:
然后我从我的激活器中删除了服务注册并创建了一个服务消费者类:
和另一个组件定义:
在这些修改之后,我的服务注入不再起作用。问题是注入的服务引用每次都是 NULL。
有谁知道为什么?我忘了什么吗?
非常感谢!
java - OSGi 环境:如何在运行时更新类引用
我在 OSGi 环境下面临以下问题:假设我有一个包 A 导出 com.mybiz.example 包。这个包,在它的 1.0.0 版本中,包含一个 bean 类 MyBean 以便
Bundle B 导出一个使用 MyBean 的接口 MyService:
注意:在我们的架构中,MyBean 必须是类而不是接口。
Bundle C 以这种方式使用 MyService 作为声明式服务:
现在,如果我需要对 MyBean 类进行热修复,就会出现问题。假设我需要添加一个字段和一些方法。然后,我有一个正在运行的 OSGi 环境,其中部署了包 A、B、C。
我的要求是我不能停止任何捆绑。
因此,在这些假设下,我部署了我的包 A 的一个新版本,比如 A_1.1.0.jar。现在我无法使包 C 使用 A_1.1.0.jar 中包含的新版本的 MyBean 类。
我该怎么做?
非常感谢你!
最好的祝福
盖尔西
osgi - 我可以拥有引用不同目标服务的组件工厂实例吗?
我创建了 3 个不同的组件:客户端、执行器和方法。
我可以有多个引用其自己的 Executor 实例的 Client 实例。所以我把 Executor 作为一个 DS 工厂组件。
Executor 可以按照一种或多种方法执行 Client 请求。所以它动态地引用(1..n)方法服务。
到目前为止,一切都很好。我的问题是我需要根据客户的意愿缩小 Executor 组件使用的方法。
我怎么能那样做?
java - 如何向其消费者提供与 OSGi 声明式服务相同的对象?
我有一个场景,我需要在 OSGi 应用程序的多个包中将相同的对象公开为声明性服务。更具体地说,有一个作为声明服务 (Service1) 公开的类。有几个服务消费者。我正在使用 maven-scr-plugin 生成 SCR 描述符。服务消费者有这样的对 Service 接口的引用。
这个服务提供者(Service1)是另一个服务(Service2)的服务消费者。所以 Service1 也会有对 Service2 的引用。
这就是我的 Service2 的样子
我遇到的问题是,我可以看到 OSGi 容器调用了 Service1 和服务使用者的绑定方法,但是绑定到服务使用者中的引用 service1 的对象没有初始化其 service2 引用。这意味着当我使用来自服务使用者的 service1 对象时,我会收到空指针异常,因为 service1 对象中没有 service2 对象。绑定到 service1 的对象与 OSGi 容器用来绑定引用 service2 的对象不同。我希望所有服务消费者都使用相同的对象。这可以解决吗?
java - OSGi/Equinox、声明式服务和延迟加载
我正在尝试使用声明式服务来创建一个为另一个包提供功能的服务包。但是,我希望我的服务提供程序包在需要时才启动。让我描述一下我的情况。
有两个捆绑包:
-com.example.serviceprovider
-com.example.serviceconsumer
Service Provider bundle 使用声明式服务提供服务,如下所示:
服务消费者引用提供的服务如下:
当这两个捆绑包在启动时都处于“活动状态”时,服务消费者与服务提供者声明的服务进行通信就没有问题。当我尝试让服务提供商以懒惰的方式启动时,就会出现问题。
在服务提供者设置为延迟加载之后,这就是我在 OSGi 控制台中得到的:
我希望看到的是,即使捆绑 16 只是“已解决”,它至少会注册的是服务。但是当我调用“捆绑”命令时,它会显示“没有注册服务”。
也许我错过了延迟加载包和服务注册的基本概念。如果捆绑包处于“已解决”状态,它不应该连接所有“电线”吗?(即,有一个类加载器、解析的导入和导出依赖项以及注册的服务。)如果服务消费者尝试访问服务,该捆绑包不应该转换到“活动”状态吗?我在这里缺少什么?
declarative-services - 设置不兼容字符串的属性
我正在使用声明式服务并面临以下问题。我想用属性注册我的组件,比如使用
bc.registerService(MyClass.class.getName(), this, props);
但是,对于声明式服务,我必须提供定义这些属性的 XML 文件。现在,问题是我没有字符串兼容的值作为属性值(键是字符串)。属性不是任何类型的数字或字符串,而是“创建”方法返回的对象。这不是问题
bc.registerService(MyClass.class.getName(), this, props);
因为 props 可以包含条目。但是我如何使用声明式服务来管理这个?
BR Ewgenij
java - OSGi 声明式服务的绑定顺序
假设我使用 OSGi 声明式服务并且我有一个服务,该服务有一个带有 policy = dynamic 的数字引用...
A - 强制一元。
B - 强制一元。
C - 强制倍数。
D - 可选的一元。
E - 可选倍数。
当我的服务启动时,所有参考资料都可用。有什么方法可以控制调用绑定的顺序吗?
我想让 B 先绑定并对进来的每个 E 做一些事情,但我无法确保 B 在 E 之前绑定。
是的,更合乎逻辑的做法是让代表 B 的服务也绑定到 E 并做它应该做的任何事情,但我不能修改 B,我只能使用它。如果我创建一个只绑定到 B 和 E 的新服务,我仍然会遇到同样的问题。
当一切都被绑定时,我可以在activate方法中做任何我需要做的事情,然后在绑定额外的(动态)E时做它,但我想知道是否还有另一种方法......