在 OSGi 参考注释中动态设置目标属性

2024-04-23

读完一篇article https://thecarlhall.wordpress.com/2010/06/06/set-osgi-service-reference-target-through-configuration/ on 参考目标 http://javadox.com/org.osgi/osgi.cmpn/6.0.0/org/osgi/service/component/annotations/Reference.html#target()(和相应的属性),我仍然不明白如何检索服务,当target is set 在运行时(通常目标和属性在编译时设置并由 SCR 在运行时评估)。

假设定义了三个服务实现@Property(name="type", value="csv"), @Property(name="type", value="xls") and @Property(name="type", value="pdf"), 分别。

一位消费者:

//@Reference(target="(type=%runtime_variable%)")
Service service;

NOTE %runtime_variable%在运行时自动评估(从设置文件中读取)。


我应该打电话吗getServiceReferences(Class<S> clazz, String filter) in the @Activate/@Modified带注释的方法以便在运行时获得正确的服务?

如果我没有明确使用,component.xml 是如何创建的@Reference并动态设置目标@Activate/@Modified带注释的方法?

我可以使用@Designate http://javadox.com/org.osgi/osgi.cmpn/6.0.0/org/osgi/service/metatype/annotations/Designate.html元类型注释可以让我的生活更简单吗?


That article https://thecarlhall.wordpress.com/2010/06/06/set-osgi-service-reference-target-through-configuration/,你已经读过,已经有 7 岁了,我不清楚它使用了哪些注释(是的,有几个)。我建议忽略它。今天你最好使用声明式服务 (DS) https://enroute.osgi.org/FAQ/300-declarative-services.html以及标准 OSGi 注释。

简而言之,有两个重要部分:

  • XML 文件位于/OSGI-INF提供/消费服务的包内的文件夹
  • 服务组件运行时 (SCR) - 一个在运行时检查其他包的包,如果它找到上述 XML 文件,则负责注册和连接服务。

虽然您可以手动编写 XML 文件,但它们通常是由Bnd http://bnd.bndtools.org/或其他使用 Bnd 的构建工具(例如我们bnd-maven-插件 https://github.com/bndtools/bnd/tree/master/maven/bnd-maven-plugin)。这是在构建时完成的,当时 Bnd 检查类的注释并使用提供的信息生成 XML 文件。因此,在运行时根本不使用注释。

至于接线,当你有

   @Reference(target="(type=pdf)")
   Service service;

service将自动连接到其中一个实例(是的,可以有多个)Service在 OSGi 的服务注册表中注册的与目标过滤器匹配的服务。这是由 SCR 在运行时完成的。您可以通过使用组件的 PID 重新配置组件来在运行时更改目标。您可以通过编程方式或通过属性文件使用配置管理 https://osgi.org/specification/osgi.cmpn/7.0.0/service.cm.html.

The @Designate您提到的注释与另一个名为 Metatype 的 OSGi 规范相关。它允许您更好地定义配置字段的类型。Here http://njbartlett.name/2015/08/17/osgir6-declarative-services.html您可以阅读有关如何将 Metatype 与 Declarative Services 1.3 一起使用的更多信息。

关于 OSGi 注释的另一个很好的信息来源是here https://liferay.dev/blogs/-/blogs/liferay-osgi-annotations-what-they-are-and-when-to-use-them(忽略 Liferay 特定的)


为了反映您编辑的问题,您有一些选择。一种是获取所有实例:

@Reference(
 cardinality = ReferenceCardinality.MULTIPLE,
 policy = ReferencePolicy.DYNAMIC,
 policyOption = ReferencePolicyOption.GREEDY
 )
protected void setService(Service service, Map<String, Object> properties) {
   String type = MapUtil.getString(properties, "type");
   _services.put(type, service);
}

然后您可以从以下位置获取服务_services按类型映射。另一个是重新配置您的组件。例如,如果你这样定义它

@Component(
 configurationPid = "my.component"
)
public class MyComponent implements ... {
   @Reference(target="(type=pdf)")
   Service myService;
}    

你可以通过配置它my.component.cfg您在其中指定

myService.target=(type=somethingElse)

您可以使用配置管理 API 以编程方式执行相同的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OSGi 参考注释中动态设置目标属性 的相关文章

随机推荐

  • 在 TypeScript 中将数组作为参数传递

    我有两种方法 static m1 args any using args as array static m2 str string args any do something call to m1 m1 args 致电给m1 1 2 3
  • Azure Blob 存储与 Azure 驱动器

    我正在考虑迁移到 Windows Azure 而不是典型的托管 但我不确定如何最好地存储图像 经过搜索 我发现有 2 种可能的解决方案 Blob 存储或 Azure 驱动器 我研究了 Blob 存储 尽管我已经开始习惯这个想法 但它需要对我
  • 将证书文件加载到证书对象中

    我正在尝试将证书文件加载到证书对象中 但出现以下异常 java security cert CertificateParsingException invalid DER encoded certificate data at sun se
  • 我需要有关如何在 Windows Azure 上部署 ASP.NET 网站的演练或步骤

    我需要有关如何在 Windows Azure 上部署 ASP NET 网站的演练或步骤 以下是在 Windows Azure 上部署 ASP NET 网站的步骤 假设 gt 1 您已经创建了一个 ASP Net 网站 Step 1 在你的机
  • 如何检测android中某个渲染器区域内的触摸事件?

    在android中我举了一个旋转球体的例子在这里给出 https bitbucket org jimcornmell opengltexturedsphere 它创建了一个简单的应用程序 显示一个旋转球体 地球 现在 如果在手机显示屏上按下
  • 加密字段的部分搜索

    最近我被分配了一个问题 加密数据库字段 例如SSN 但仍然必须保持 部分搜索 工作 例如 SSN 123 45 6789 在数据库中被加密为 abcdxyz 当用户在搜索框中输入 2345 时 它必须出现在结果中 我们的数据库中有数百万条记
  • 截断表后序列不会重置

    我在截断表后使用 SELECT lastval 来获取错误的序列号 当我截断表时 我使用 SELECT lastval 我得到了错误的 ID Use the TRUNCATESQL 命令 对于单个表 语法如下 TRUNCATE TABLE
  • 如何处理特定类型集合的操作?

    在我的申请中的几个不同地方 我需要采取Seq SalesRow 并返回一个Map String SalesRow 其中字符串是国家 地区的名称 我需要在几个地方使用它 例如 我获取所有 SalesRows 的列表 并获取按国家 地区划分的全
  • Cygwin - 如何安装 ansible?

    如何使用 Cygwin 获取 安装 ansible 我尝试了以下步骤 但在第 5 条期间 运行时 python setup py 安装 步骤取自 取自https servercheck in blog running ansible wit
  • 为什么自动布局中的CGAffineTransform Rotate会移动动画视图?

    我想使用以下代码旋转 imageView UIView animateWithDuration 25 animations self imageView transform CGAffineTransformRotate self plus
  • 筛选提取-opencv

    我正在尝试开始使用 C OpenCv 进行筛选特征提取 我需要使用 SIFT 提取特征 将它们在原始图像 例如一本书 和场景之间进行匹配 然后计算相机姿势 到目前为止我已经找到了这个算法 http opencv itseez com doc
  • 如何在 Cucumber-JVM 中并行运行场景? [复制]

    这个问题在这里已经有答案了 我有一组为 Cucumber JVM 编写的验收测试 为了减少反馈时间 我想并行运行 功能的 场景 我该如何以最简单 最方便的方式做到这一点 我希望能够在 Java 代码中表达这一点 作为常规的 JUnit 测试
  • 带有不使用索引的查询变量的 SELECT

    我正在尝试 出于兴趣 通过使用局部变量的递归查询来检索简单邻接列表中的节点树 到目前为止我的解决方案很有趣 但我想知道 这是我唯一的问题 为什么 MySQL 拒绝使用任何INDEX来优化这个查询 MySQL 不应该能够通过使用INDEX 我
  • 由两个向量 (n,1) 构建的 R 距离矩阵

    我有两个向量 x n 1 and y n 1 真实值 我想创建一个矩阵M n n 这些向量包含每两对之间的距离 您可以使用outer功能 x lt sample 5 y lt sample 5 x 1 1 5 3 4 2 y 1 2 3 5
  • 这是在 Django 中进行依赖注入的正确方法吗?

    我正在尝试将依赖项注入到我的 Django 视图 控制器 中 这是一些背景知识 通常情况下 urls py文件是处理路由的 通常是这样的 urlpatterns path views get all posts name get all p
  • ngx-translate 在延迟加载模块中不显示任何文本

    我们在应用程序中使用 Angular 6 我们最近开始为我们的应用程序准备延迟加载 应用程序有多个延迟加载的路由 我们希望对所有路由使用单一语言文件 不需要将其分成块 但在引导程序上加载所有翻译 我尝试的第一件事就是在 AppModule
  • 使用 C# 进行 ECDHE 密钥交换

    我正在尝试使用 net 通过 TLS 1 2 进行 ECDHE 密钥交换 服务器正在响应 server key exchange 消息 该消息以 04 开头 所以我猜它是未加密的 根据我的理解 消息的前 32 位被视为值 X 接下来的 32
  • 分形加密

    我听说可以使用 Mandlebrot 集的图来加密数据 并且这种加密算法是量子安全的 与许多常用算法不同 不能用量子计算机破解 我在 Google 上查找更多信息 但只找到了一些针对非技术受众的文章 有谁有任何这方面的资源 我可以用它来了解
  • Scapy 不需要的 RST TCP 数据包

    为了理解TCP是如何工作的 我尝试伪造自己的TCP SYN SYN ACK ACK 基于教程 http www thice nl creating ack get packets with scapy http www thice nl c
  • 在 OSGi 参考注释中动态设置目标属性

    读完一篇article https thecarlhall wordpress com 2010 06 06 set osgi service reference target through configuration on 参考目标 h