问题标签 [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 投票
1 回答
1887 浏览

configuration - OSGi 声明式服务和配置管理

我正在编写与声明性服务使用捆绑在一起的内容。对于配置,我在 DS 声明中使用属性。这些道具通常可以由 Config Admin 更改,但它们不会持久化。容器重启后,组件具有默认值。

我正在使用这样的配置管理员:

在组件中我有:

我正在使用 Felix,属性文件存储在缓存中

但是重启后没有加载。我做错了什么?感谢所有提示。

0 投票
1 回答
996 浏览

osgi - 我的声明式服务激活器如何失败?

当我知道失败不可恢复时,在声明式服务的 activate() 方法中失败的最佳方法是什么?具体来说:我的服务可以通过带有元类型属性的 configadmin 进行配置。如果配置无效(例如格式错误的 URL),失败的最佳实践方法是什么?我目前的做法是抛出 IllegalArgumentException。有没有更好的办法?DS主机是否关注异常类型,还是所有异常都被同等对待?

4.2 规范简单地说“如果激活方法抛出异常,SCR 必须使用日志服务记录包含异常的错误消息(如果存在),并且组件配置未激活。” 这向我表明,我可以抛出任何异常,而哪一个并不重要。

我注意到 DS 会在某些情况下重试 activate 方法,例如如果其他依赖项之一发生更改。是否有任何机制可以告诉基础设施不要打扰,除非配置是固定的?还是我应该不担心,只是接受我的激活器会被多调用几次?

0 投票
1 回答
568 浏览

java - 使用声明式服务的 OSGi+Pax-Web 中的 GWT 问题

我正在迁移在 OSGi (Equinox) 和 Pax-web 上运行的现有 GWT 应用程序,以使用声明式服务而不是程序化服务跟踪器。

我在 Equinox 中使用 Pax-Web。PAX-WEB War 扩展器可以毫无问题地加载基于 WAR 的 GWT 应用程序,但在这种操作方式中您不能拥有声明式服务。

我成功地从战争中重构了所有 servlet,并将它们转换为声明性 OSGi 服务 ( <provide interface="javax.servlet.Servlet"/>)。这样我就摆脱了 servlet 中所有凌乱的 ServiceTracker 代码和特定的 OSGi 依赖项。我进一步复制了所有其他 web.xml 功能,以使用[1]上的信息注册过滤器、提供静态内容和欢迎页面

此时,它通常应该可以工作,但我遇到了 PAX-WEB 和 GWT 尝试加载其资源的方式的问题:

在加载序列化描述符时,GWT 从本地上下文加载序列化策略文件。在我的例子中,它尝试解析这样的资源:/ctx/ctx/62394587E47773FB1594FF.gwt.rpc 此资源由 GWT 编译器创建并放置在:/war/ctx/ctx/resource...

以前,使用标准 wab 映射 ( Webapp-Context: /ctx, Webapp-Root: /war) gwt 会正确找到它的资源。现在我正在使用程序化资源映射:

GWT 无法加载资源并产生以下错误:

[注意最后一句应该是“你会因此而遇到大量的序列化问题”]

我已经跟踪到 HttpServiceContext 加载资源并将路径解释为文件而不是相对于编程 Web 上下文的 url 的问题:

这显然失败了,因为此资源位于捆绑文件系统中的 /war/ctx/ctx/ 下。这似乎与错误 PAXWEB-314 [2] 有关,其实现是将相对路径转换为文件路径:

有没有办法解决这个问题?有人使用 GWT 和 PAX-WEB 使用 OSGi DS 而不是 WAB?一种可能的方法是将 GWT 编译器生成的 /war/ctx 复制回 /ctx,但我想在进入 hack 方向之前找到一个不错的解决方案。

有任何想法吗?

1 - https://github.com/ops4j/org.ops4j.pax.web/blob/master/samples/whiteboard/src/main/java/org/ops4j/pax/web/extender/samples/whiteboard/internal/ Activator.java [2] - http://team.ops4j.org/browse/PAXWEB-314

0 投票
1 回答
1840 浏览

osgi - 在 OSGi 中使用声明式服务实现服务工厂

我正在使用 OSGi 声明式服务和设置注册 OSGi 服务

服务工厂=“真”

如下。

我正在尝试从另一个捆绑包中多次使用该服务。但是,它返回给我相同的服务实例。

这里可能出了什么问题?

0 投票
2 回答
1773 浏览

osgi - OSGi 片段包可以发布声明性服务吗?

我创建了一个片段包,用于访问第二方 jar 的一些添加功能。我的片段应该注册一个服务来公开这个新功能。它似乎不起作用。在深入进行故障排除之前,我想知道这是否允许?也就是说,Felix SCR 的 bundle watcher 是查看还是忽略 Fragment?

0 投票
3 回答
139 浏览

java - 未通过向组件添加服务引用调用 Service.FindHook 事件

今天我在 OSGi Hooks 上做了一点工作,特别是服务FindHookEventListenerHook服务。我想尝试代理服务。工作正常,我的EventListenerHook服务被代理了。但是我意识到,FindHook如果服务将通过使用(Bnd 样式)注释相关setXXX方法来获取服务实现的引用,则不会调用该事件。@Reference也许这不是注释的问题,但一般来说是DS。

这很糟糕,因为注册了两项服务,一项没有代理,一项已代理。我只想从代理那里获得参考。一般来说,如果没有 DS,你可以通过调用获取引用,BundleContext.getServiceReference(java.lang.Class<S> clazz)并且事件FindHook.find将被调用,你可以在其中决定ServiceReference要返回哪个。

当我使用类似 DS 的方法(对我来说:Bnd 注释@Reference)时,将执行什么样的流程?正如我在上一节中所描述的:我想决定应该引用哪些服务。

0 投票
1 回答
519 浏览

eclipse - Eclipse P2 - 具有各种 P2 组件的声明式服务?

所以我一直有这个问题,当我尝试使用这个从供应代理获取元数据和工件存储库管理器时:

如果这些服务已经启动,则可以正常工作。然而,很多时候工件管理器返回 null 是因为它的服务还不存在。通过将包含上述代码的捆绑包的启动级别设置为 5,我已经能够绕过它,因此在我尝试获取它们的服务引用之前,所有服务都已启动。

我真的不想乱搞开始级别。我想做的是使用声明性服务来设置这些不同的组件,从而延迟我的服务的启动。唯一的问题是我不知道要引用哪些服务,所以我可以将它们放在我的 component.xml 文件中。这在 eclipse 3.7.2 中是否可行?

0 投票
2 回答
3213 浏览

java - 如何在 OSGi 中正确地将 ManagedServiceFactory 实现为声明式服务?

我有需要在每个配置基础上创建的服务,每个服务都依赖于外部资源,因此应该管理它自己的生命周期(即(取消)注册服务)。因此将这些实现为 DS 并让 SCR 产生多个实例是行不通的。

可以实现一个注册 ManagedServiceFactory 的包来完美地完成这项任务(请参阅我的上一篇文章)。但结果是,如果工厂依赖于其他几个服务,您需要开始跟踪这些服务并编写大量胶水代码以使一切运行起来。相反,我想将工厂实现为(单例)声明性服务,SCRManagedServiceFactory在服务注册表中注册 a 。

这是我的尝试:

和服务描述:

我已经发现服务描述中的“工厂”属性是错误的路径,因为这样组件永远不会ManagedServiceFactory在服务注册表中注册,而是变成ComponentFactory.

作为一种hack,我只是添加了一个组件属性,即

并补充道configuration-policy="ignore"。这有效:命名的配置my.project.servicefactory-foobar.cfg被交给我的服务,它在服务注册表中注册它们,一切都很好。

但是有两件事我不喜欢:

  1. 手动设置属性service.pid对我来说就像一个肮脏的黑客
  2. 设置configuration-policy="ignore"阻止我配置它ManagedServiceFactory自己。如果我转义此属性或将其设置为要求,我将获得一个ManagedServiceFactory用于命名的配置my.project.servicefactory.cfg,然后为每个使用该模式命名的配置获得两个服务my.project.servicefactory-foobar.cfg:一个ManagedServiceFactory由 SCR 产生,一个ServiceInterface在我ManagedServiceFactory收到有关此新配置的通知时第一次注册. (至少这不会以指数方式增长,因为 SCR 会覆盖service.pid工厂配置的属性)

那么我应该如何正确设置呢?

PS:对于那些想知道我在他们的文件名上引用配置的人:我使用 Felix Fileinstall 进行配置,因此foo.cfg将 PID 放入 ConfigAdmin 中foo,并foo-bar.cfg放入factory -pidfoo中。

0 投票
2 回答
334 浏览

java - 最好使用类型或属性在 OSGi 声明式服务之间进行选择?

我目前正在将一段代码从纯 Java 代码转换为 OSGi 声明式服务。

原始纯 Java 代码

这些类是这样声明的:

所以所有的类都实现了 Service,但是 Aggregate 实现能够在调用时推迟到子 Service。

AggregateServiceImpl 本身不知道其他实现的存在。它的构造函数最初声明为:

澄清:接口名称“服务”是通用的,并不意味着代表 OSGi DS 或服务概念。

转换为 OSGi

首先,我将每个实现移动到它自己的包中。然后我声明我的组件(服务实现)。我碰巧在使用bnd,所以我使用服务注释。例如:

在客户端类中,我们可以使用低级 OSGi API 查找服务或使用该捆绑包中的 DS 为我们创建对象。

问题

查找“服务”的最佳方式是什么?我想要AggregateServiceImpl 但我可能会收到 ChildServiceImpl 之一。

在查找 ServiceReferences 时,最好使用单独的服务类型或将属性添加到其中一个组件(例如“isRootService”)以用作过滤器?

0 投票
2 回答
634 浏览

java - 在 OSGi 中,如何优雅地处理初始化异常?

我正在使用 Maven-SCR。通过使用@Componentand@Service标签,我可以让我的类实例自动注册它提供的接口。

但是,有时,activate 方法(标记为@Activate)甚至构造函数可能会抛出异常并以我无法处理的方式失败。

问题是:我想捕获该异常,以便正确记录它,但同时,我想防止该类在无法激活或初始化时发布其服务。

你们是怎么做到的?

谢谢!