问题标签 [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.

0 投票
3 回答
2483 浏览

osgi - OSGi DS:使用 Felix SCR @Reference 注释省略取消绑定方法

OSGi 声明式服务被明确允许有一个绑定方法,而没有匹配的 unbind 方法作为引用,因为“一旦组件配置被停用,SCR 必须丢弃对组件实例和与激活关联的组件上下文的所有引用。”

我正在使用 Apache Felix maven-scr-plugin 从 Java5 注释生成我的服务组件 XML。如果我从 @Reference 注释中省略了“unbind”属性,那么我会得到这个失败:

为什么可控硅发生器这么严格?有没有办法告诉它容忍省略的 unbind 方法?也许我需要向 Felix 提交缺陷?

当然,在我的服务中添加简单的取消绑定方法很容易,但规范说它们是不需要的。

0 投票
2 回答
193 浏览

osgi - OSGi 中是否有办法确保一次只有一个事物可以访问服务?

我有一个定义系统中设备的接口。这些设备旨在一次仅由一个实体使用。我想将每个设备注册为 OSGi 服务,以便其他人可以通过该机制访问设备(使用声明式服务或服务跟踪器)。但是,据我所知,该机制允许所有实体请求相同的服务。

有没有办法让第一个请求者获得服务或使用声明式服务只有一个服务组件得到满足?

0 投票
5 回答
5460 浏览

java - 在 JUnit 测试的上下文中使用 OSGi 声明式服务

我试图弄清楚如何使用 JUnit 在 OSGi 中实现多捆绑集成测试。

对于集成测试,我的意思是实例化捆绑包的子集以自动验证该子系统中的功能。

我们正在运行 Equinox 并使用 Eclipse 作为工具链。Eclipse 提供了“Run as JUnit Plug-in”选项,它启动了 OSGi 框架并实例化了配置包,所以我想这是要遵循的路径,但我找不到将 DS 引用注入我的测试的方法。我已经看到使用 ServiceTracker 作为访问不同服务包的编程方式,但这超出了拥有 DS 的目的,不是吗?

我刚刚开始使用 OSGI,所以我想我只是错过了一些可以让我将多捆绑测试放在一起的难题。

有任何想法吗?

谢谢,杰拉德。

*编辑:解决方案*

在进一步研究了这个问题之后,我终于弄清楚了如何使用 JUnit 插件功能来放置这个多包集成测试:

为了使动态服务注入起作用,必须创建一个服务定义文件,其中必须声明注入的依赖项,就像使用 DS 时通常所做的那样。该文件(通常)位于OSGI-INF/目录下。例如OSGI-INF/service.xml

service.xml 必须声明此测试所需的依赖项,但不提供自己的服务:

这将指示 DS 使用声明的 onServiceUp 方法注入对 FooService 的依赖项。onServiceDown 必须在运行测试后的 OSGi 关闭阶段调用时实现。

com.test.functionaltest.MyTester 包含要执行的测试方法,遵循典型的 JUnit 实践。

到这里为止,一切都“按部就班”。然而,如果 Junit 运行,它会在访问对 FooService 的引用时抛出 NullPointerException。原因是 OSGi 框架与 JUnit 测试运行器上下文处于竞争状态,通常,Junit 测试运行器会赢得竞争,在注入所需服务的引用之前执行测试。

为了解决这种情况,需要让 Junit 测试等待 OSGi 运行时完成它的工作。我通过使用 CountDownLatch 解决了这个问题,它被初始化为测试中所需的依赖服务的数量。然后每个依赖注入方法都会倒计时,当它们都完成后,测试将开始。代码如下所示:

请注意,fooService引用需要是静态的,以允许在 OSGi 和 JUnit 执行上下文之间共享服务引用。CountDownLatch 为安全发布此共享引用提供了高级同步机制。

然后,应该在测试执行之前添加一个依赖检查:

这样,Junit 框架会等待 OSGi DS 服务注入依赖项,否则会在超时后失败。

我花了很长时间才完全弄清楚这一点。我希望它可以为将来的程序员同行省去一些麻烦。

0 投票
2 回答
1688 浏览

eclipse - OSGi 声明式服务 - 在绑定方法中获取 ServiceReference

我将 Eclipse 3.7 与 Eclipse Gemini JPA / DBAccess 一起使用。我实现了一个引用 EntityManagerBuilderFactory 的声明性 ServiceComponent。绑定方法如下所示:

但是我需要 ServiceReference 来获取此服务的属性,例如:

我是否必须在 ServiceRegistry 中搜索此 ServiceReference,还是有更优雅的方法?

干杯,穆基

0 投票
0 回答
273 浏览

java - 我应该如何通过 OSGi 声明式服务声明 has-a 依赖项?

我的 OSGi 应用程序使用白板模式来注册特定状态更改的侦听器。我使用 org.apache.felix.scr.annotations 来声明我的服务和组件,而不是手动编码声明性 XML。将我的组件注册为 ChangeListener 的最简单方法如下:

这是一种 is-a 关系,它将我的组件暴露给任何要求它的人。相反,我希望有一个通过内部类注册我的 ChangeListener 的关系。但是与上面相比,下面的内容非常难看。

有没有更好的方法来实现包含的侦听器,它不是那么冗长但仍然实现内部类的信息隐藏?

0 投票
1 回答
1295 浏览

eclipse - 使用 OSGi 声明式服务获取服务实现列表

我有一个非常简单的声明式服务示例。我正在关注本教程http://www.eclipsezone.com/eclipse/forums/t97690.html?start=0。每件事都按预期工作。但是,我无法弄清楚如何使“SampleImporter”(预计将使用其他捆绑包服务的捆绑包)知道“SampleExporter”列表(提供服务的捆绑包)。换句话说,我希望“SamlpeImporter”看到它最终使用的包的 ID。此信息对我的应用程序非常有用。

这是 SampleExporter 的 XML 文件:

而对于 SampleImporter:

在进口商方面,我有以下功能:

}

这很好用,但是如果我想获取属性的值,请使用

或者

导出器的方法 run 从未被调用,这意味着绑定函数(未调用 setRunnable)。但是,使用控制台命令“服务”我看到导出器包被导入器使用。此外,使用 ss 和 ls 我可以看到组件 eporter 是“满意的”。我的实施有什么问题?

提前致谢

干杯

玛丽

0 投票
1 回答
1443 浏览

service - OSGi 服务 - 最佳实践

我开始越来越喜欢 OSGi 服务,并希望将我的更多组件实现为服务。现在我正在寻找最佳实践,尤其是对于 UI 组件。

对于听众关系,我使用白板模式,恕我直言,这是最好的方法。但是,如果我想要的不仅仅是通知,我可以想到三种可能的解决方案。

想象以下场景:

[1] 白板图案 - 具有自我设置服务

我会创建一个新的服务接口:

并使用这样的bindConsumer方法创建声明性 IDatabaseService 组件

这种方法假定只有一个 IDatabaseService。

[更新]用法如下所示:

[2] 让我的课程成为一项服务

图像类如

公共类 DatabaseEntryViewer 扩展 TableViewer

现在,我只需为我的 IDatabaseService 添加绑定/取消绑定方法并添加一个 component.xml 并添加我的 DatabaseEntryViewer。这种方法假设有一个非参数构造函数,并且我通过 OSGi-Service-Factory 创建 UI 组件。

[3] 经典方式:ServiceTracker

在我的 Activator 中注册静态 ServiceTracker 并访问它的经典方法。使用跟踪器的类必须处理动态。

目前我更喜欢第一种,因为这种方法不会使对象创建复杂化,并将 Activator 从无休止的静态 ServiceTracker 中保存下来。

0 投票
3 回答
2194 浏览

osgi - OSGi 和组件管理

我有一个动态应用程序,它使用 OSGi 在运行时加载模块化功能。OSGi 包包含模块化功能,应用程序会在需要时加载这些包。这种方法可以,但我想要一个更细粒度的解决方案。捆绑包包含通过声明式服务控制的组件。我希望能够加载一个包,并且只启用包中需要的组件。我已经在这方面进行了研究,但找不到我满意的解决方案。一种方法是创建一个始终在捆绑包中启用的“看门人”组件,并通过 ComponentContext 让它调用启用和禁用组件。这是一个可行的解决方案,但我无法找到让“看门人”“了解”的方法

我更喜欢的是一种加载捆绑包并“了解”已加载捆绑包中所有组件的方法。能够确定组件位于哪个捆绑包中以及它们当前处于什么状态(类似于列出所有组件的Equinox 控制台命令“ls”)。我想在需要时启用和禁用组件。

控制台如何做到这一点,我怎么能在应用程序中做到这一点?

更新:@Neil Bartlett:抱歉耽搁了。我不得不转向别的事情。现在我回到这个问题上。真的很感激任何进一步的帮助。我的应用程序是基于角色的。我需要根据它们提供的功能启用组件。目标是最初禁用所有基于角色的组件。角色更改后,角色管理器会轮询每个组件以获取其提供的功能并确定是否加载它。每个组件将广播它提供的功能(通过公共服务接口)。ScrService 不允许我启用最初禁用的服务组件。最初启用组件并让 ScrService 在应用程序启动期间尽快禁用它们不符合我的需求。

0 投票
0 回答
262 浏览

soap - 如何在声明式服务的组件定义中设置不同的 ECF 分发提供者?

我必须测试 ECF 中存在的所有远程服务提供者(或者至少是常见的:通用、r-osgi、SOAP 和 REST)的性能,因此以一种简单的方式从一个提供者更改为另一个提供者会很有帮助.

我知道如何在 component.xml 文件中设置一些提供程序的 Endpoint Description,例如,对于 Generic 是:

将“service.exported.configs”修改为其他名称,例如“ecf.r_osgi.peer”,将毫无问题地更改提供程序,并且无需重新编译代码。

此外,“containerfactoryargs”属性也存在一些差异(例如,在前面的示例中将 ecftcp://更改为r-osgi://。但是,在提供程序列表中,我没有看到其他示例中关于这种差异的示例提供者(例如,我将如何使用 SOAP?该提供者的服务属性是什么?)

此外,使用 Restlet(例如)意味着修改服务的源代码以添加 @Get("text") 注释,如此处所述。那么,您是否有义务在服务代码中添加注释以将它们公开为 Restful 或 SOAP 服务?我不想在我的服务中添加“侵入性”代码,或者尽可能避免从其他方法(例如 ConfigurationLoader)激活它们。

那么,是否有任何信息页面包含所有(或至少是最常见的)分发提供商的组件定义文件示例?或者,在不重新编译源代码的情况下更改提供者的最优雅方式是什么?也许,如前所述,使用 ConfigurationLoader 服务来更改属性?

提前致谢!

0 投票
2 回答
675 浏览

java - Eclipse/Equinox:启动所有已安装的插件?

我有一个使用特性的 Eclipse 产品构建。所有服务都是通过声明式服务注册的。据我了解,必须启动捆绑包,服务组件运行时才能获取并注册每个捆绑包中公开的服务。

我想自动启动安装在我的 OSGi 运行时中的每个包。有没有一种简单的方法可以做到这一点?我唯一能找到的是 Product > Configuration > Start Levels > Auto-Start 选项。我不想在我拥有的每个产品构建中都这样做,因为我想转移到功能来分组和一起启动类似的捆绑包。

有没有简单/推荐的方法来做到这一点?