问题标签 [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.
java - 满足和不满足的声明式服务组件
我正在开发一个基于 OSGI 的系统,它使用声明性服务来定义组件。但是,当从 Eclipse 运行它时,我的组件之一未初始化。当我使用简单的控制台命令调查问题时,我得到以下输出(带有一些小混淆):
所以组件有state = Unsatisfied
,但是动态信息表明组件是满足的并且它的组件引用也被满足。
有人可以解释一下吗?为什么我的组件没有初始化?
更新:显然,immedate="true"
组件的设置修复了初始化问题。osgi 命令仍然有state = Unsatisfied
。有人知道为什么吗?
osgi - 在声明式服务中。当服务被停用时,何时删除对它的引用?
如果我有一个被其他组件(称为 B)引用的服务 A,那么 B 对 A 的引用何时变为空?
- 在调用 A 的 deactivate 方法之前?
- 调用A的deactivate方法后,完成了吗?
- 对象的实例被销毁后?
我浏览了纲要规范,但找不到有关此的详细信息。如果有人能为我澄清一下,我将不胜感激。
此外,当服务 A 被激活时,它是在什么时候作为对 B 的引用而被注入的?在激活方法之前还是之后?
java - 处理动态 OSGi 服务依赖关系的最佳方法
我有一个看起来像这样的可选服务依赖项:
现在,如果在 testService.performSomeTask() 运行时服务变得未绑定,我有问题,对吗?我需要在所有这些功能中添加同步块,还是有更好的方法来处理这种情况?
java - Apache Felix SCR @Reference 备忘单
我在我的应用程序中使用 Apache Felix 声明式服务,并且我正在寻找一份备忘单,其中描述了可以提供给@Reference
注释的参数。我曾经看到一个网页,其中包含一个非常有用的备忘单(或表格),但我似乎找不到它。我认为这对很多 Felix 用户来说很有用。我说的参数:
- 基数:
MANDATORY_UNARY, MANDATORY_MULTIPLE, OPTIONAL_UNARY, OPTIONAL_MULTIPLE
- 策略:
EVENT, LOOKUP
- 政策:
DYNAMIC, STATIC
- 政策选项:
GREEDY, RELUCTANT
基数相当简单,但其他人对我来说并不清楚。他们做什么以及如何工作?
service - OSGi:没有生命周期管理的服务绑定
我正在 Equinox OSGi 框架上构建一个 Java 应用程序,并且我一直在使用 DS(声明性服务)来声明引用和提供的服务。到目前为止,我实现的所有服务消费者恰好也是服务提供者,所以我很自然地将它们设为无状态(以便它们可以被多个消费者重用,而不是依附于一个消费者)并让它们成为由框架实例化(默认构造函数,在我的代码中没有调用)。
现在我有一个不同的情况:我有一个MyClass
引用服务MyService
但本身不是服务提供者的类。我需要能够实例化MyClass
自己,而不是让 OSGi 框架实例化它。然后我希望框架将现有MyService
实例传递给MyClass
实例。像这样的东西:
我的第一次尝试是使用 DS 创建组件定义并从那里MyClass
引用:MyService
但是,MyClass
它并不是真正的组件,因为我不希望管理它的生命周期——我想自己处理实例化。正如尼尔巴特利特在这里指出的那样:
例如,您可以说您的组件“依赖于”特定服务,在这种情况下,该组件将仅在该服务可用时创建和激活——并且当该服务不可用时它也将被销毁。
这不是我想要的。我想要没有生命周期管理的绑定。[注意:即使我将基数设置为0..1
(可选和一元),框架仍然会尝试实例化MyClass
(并且由于缺少无参数构造函数而失败)]
所以,我的问题是:有没有办法使用 DS 来获得我正在寻找的这种“仅绑定,无生命周期管理”功能?如果 DS 无法做到这一点,有哪些替代方案,您会推荐什么?
更新:使用ServiceTracker
(由 Neil Bartlett 建议)
重要提示:我在下面发布了一个改进版本作为答案。我只是出于“历史”目的而将其保留在这里。
我不确定ServiceTracker
在这种情况下如何申请。您会使用如下所示的静态注册表吗?
你会这样做吗?你能评论我在上面评论中写的问题吗?那是:
- 如果
Set
服务实现没有正确实现equals
和hashCode
. - 竞争条件:经过我的
isActive
检查,该服务可能会变为非活动状态。
osgi - 如何引用实现给定接口的所有组件?
我在 Eclipse Equinox OSGi 环境中使用 Apache Felix 服务组件运行时 (SCR)。
声明了几个实现接口的组件,org.example.Producer
例如:
现在在另一个组件中,我想引用所有org.example.Producer
动态实现接口的组件:
但这在运行时会出错。似乎 SCR 在其搜索过滤器中包含了一个组件名称:
正如您在错误消息中看到的那样,它正在显式搜索名称为 的组件org.example.Producer
。但是上面列出的组件都没有这个名称(org.example.ProducerA
, org.example.ProducerB
)。
所以问题是如何通过忽略名称来动态引用为给定接口提供实现的组件?
java - 在 OSGi 中回调和传递对象引用
Bundle-A 使用 Eclipse 环境中的声明性服务绑定来自 Bundle-B 的包。
然后 Bundle-A 通过传递一个“数据”和“类对象的引用”向 Bundle-B 发送一条消息,该类对象应该得到对该消息的响应作为参数。例如。发送(数据,EgClass_1.this);
Bundle-B 应该处理消息并将响应发送回 Bundle-A 中等待响应的类。
不幸的是,这在 OSGi 中是不可能的,因为它会创建一个循环。两个捆绑包不能相互导入。
我想传递对类对象的引用,以便 Bundle-B 可以调用它的方法来获取信息,而不是传递太多参数,但最重要的是,Bundle-B 可以跟踪它应该调用回调的类实例. 我将拥有该类及其子类的多个实例。
作为一种解决方法,我将 Bundle_A 分为两个,接口和实现类。这样 Bundle_A 可以绑定 Bundle_B 并且 Bundle_B 可以导入 Bundle_A 接口的接口定义,以便它可以使用作为参数传递的对象引用。
但是上面的方法感觉不干净,并且与 OSGi 原则不谋而合。这种双向沟通有没有更好的方法,或者我做得对吗?提前致谢!
java - 具有 ds 注释的一个目标服务的多个 PID
我想知道是否可以使用声明性服务注释来利用 osgi 企业规范的par.104.7.5(使用多位置)中解释的内容。引用规格:
Bundles 也可能对一个目标服务的多个 PID 感兴趣,因此他们可以为一个服务注册多个 PID。[...]
对主机配置感兴趣的 Bundle 将注册具有以下属性的托管服务:
Bundle 将针对 PID 和 PID 被回调,
com.acme.host
因此com.acme.system
必须区分这两种情况。因此,此托管服务将具有如下回调:
我尝试使用以下语法:
但这失败了。当然,可以参考 config admin 并根据所需的 pid 浏览配置,但这对我来说似乎有点不雅,因为理论上可以将其委托给 ds 注释。
可能吗?什么是正确的语法?
谢谢!
java - 在 pax 考试测试阶段未创建配置管理和声明性服务
我在 DS 中编写了一个 @component,它应该在多个实例中被实例化和激活。为了测试我已经编写了一个 pax 考试测试,我在其中启动 karaf 并添加了 scr。一切正常,但是......在测试方法运行之前它不会实例化服务,因此我没有空间进行断言等。
我在这里做错了什么?因为当方法退出时,它将正确创建和激活具有所有属性的服务。
我可以补充一点,使用线程“ion(3)-127.0.0.1”的测试方法以及当 DS 实例化时使用线程“84-b6b23468b652)”。
干杯,马里奥
更新 3 实际上有两个错误,一个在我身边,一个在其他地方(在 felix CM 中?),因为我的接口 impl 包可以在一段时间后访问配置(当容器关闭时),但它确实应该绑定到pax 测试包(当然还有 CM 本身)并且在容器关闭时从未“免费:d”。我不知道那个错误在哪里 - 我将结束一个简约的 mvn 项目并尝试 felix cm 家伙,我将在此处发布更新。
更新 2如果有人有兴趣关注进度(如果有错误;), 我已经提交了一个错误(https://ops4j1.jira.com/browse/PAXEXAM-725)
更新 1 这是我在测试类中的配置
这是 testclass 中的配置,它将使用基类作为基选项。
基本配置来自基类
测试包是
并且 CouchbaseConnectionProvider 在同一个包上
实施:
这是 Couchbase Provider 的项目结构和我未能开始工作的测试(直到测试运行后;)。
osgi - 无法使用 bndtools 启动声明式服务 (DS) 组件
我已经为 Eclipse 安装了标准bndtools插件,启动并运行了 apache felix osgi 运行时。我正在尝试了解声明性服务 (DS) 组件。显然,在没有注释之前(bndtools 教程中给出了一个示例),组件是使用 xml 数据编写的。这就是我想要做的。
这是一个简单的类(将作为 DS 组件发布):“HelloComponent.java”
这是进行组件声明的 xml 文件:“minimal.xml”
这是 bndtools 应该使用的 .bnd 文件来生成最终将发布到 OSGi 运行时的 jar 文件:“minimal_ds.bnd”
请注意,我在主机运行时 OSGi 容器中启动并运行了以下捆绑包:
尽管一切都在积极运行,但我无法弄清楚为什么 DS 组件没有被初始化(我应该看到控制台输出:“HelloComponent created.”)。任何帮助表示赞赏。
最后,这里是项目目录结构: