- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要给定 OSGI 组件的多实例,即一些 bundle 将获得相同的实现实例,而其他 bundle 需要另一个实例。如果可能,我需要使用 XML 文件 而不是注释(如 @Component)。我使用的是混合 OSGI 4.3 平台,包含来自 eclipse 和 felix 的 bundle 。
比方说,我的服务界面是这样的:
public interface SocketService {
// Does nothing if already listening on given port
public void startListening(int port);
public String getNextMessage();
}
声明性 XML 文件如下所示并且工作正常:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="SocketService">
<implementation class="declarativemultiton.service.impl.SocketServiceImpl"/>
<service>
<provide interface="declarativemultiton.service.SocketService"/>
</service>
</scr:component>
这些是消费者类,具有相同的语义:
public class Consumer1 {
public void activate() {
System.out.println("Consumer1 activated");
}
public void setSocketService(SocketService service) {
System.out.println("Consumer1 got SocketService@" + System.identityHashCode(service));
}
}
public class Consumer2 {
public void activate() {
System.out.println("Consumer2 activated");
}
public void setSocketService(SocketService service) {
System.out.println("Consumer2 got socketservice@" + System.identityHashCode(service));
}
}
以及它们的组件定义 XML:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Consumer1" immediate="true">
<implementation class="declarativemultiton.consumer1.Consumer1"/>
<reference bind="setSocketService" cardinality="1..1" interface="declarativemultiton.service.SocketService" name="SocketService" policy="static"/>
</scr:component>
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Consumer2" immediate="true">
<implementation class="declarativemultiton.consumer2.Consumer2"/>
<reference bind="setSocketService" cardinality="1..1" interface="declarativemultiton.service.SocketService" name="SocketService" policy="static"/>
</scr:component>
一切都按预期工作,并且两个组件都获得相同的实例:
Socket Service Impl activated
Consumer1 got SocketService@1769618707
Consumer1 activated
Consumer2 got socketservice@1769618707
Consumer2 activated
我需要 Component1 和 Component2 获取不同 SocketService 实例,并且 Component2 和 Component3(未显示)具有相同 SocketService 实例。
如果我将配置策略更改为“要求”,则不会激活消费者组件:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" configuration-policy="require" name="SocketService">
<implementation class="declarativemultiton.service.impl.SocketServiceImpl"/>
<service>
<provide interface="declarativemultiton.service.SocketService"/>
</service>
</scr:component>
这是我迷路的地方,我不知道如何将配置动态传递给 SocketService。在阅读有关 ConfigurationAdmin、ManagedService、ManagedServiceFactory、ComponentFactory 等内容时,我一直在纠结。我找不到一个具体、简洁的解决方案。有一些相互矛盾的方法,比如这个答案 https://stackoverflow.com/a/4129464/330464说不要使用 ManagedService,而是使用 Karaf 教程 http://sully6768.blogspot.com.tr/2012/09/declarative-services-with-karaf-part-4.html解决了它的使用问题。
最佳答案
我认为您使用服务属性来识别或区分使用组件上的 SocketFactory 实例和目标属性以确定使用哪一个是正确的方法,但我建议使用配置而不是每个实现使用多个组件 xml类(class)。我不太清楚您有多少个 SocketFactory 或消费者的实现类。为了说明,我将假设每个人都有一个。
您可以通过 config admin 使用 DS 组件的配置,而不是复制组件 xml 并在那里修改属性。 Peter Kriens 在此处对 DS 包括配置进行了很好的解释: http://enroute.osgi.org/services/org.osgi.service.component.html .以下是一些更详细地涵盖使用配置设置引用的步骤:
将配置 pid 添加到您的组件 xml。让我们假设 socketFactory 为 socketFactory,消费者为 consumer。
安装配置管理员。我觉得 felix 和 eclipse 都很好,我只用过 felix。
在您想要安排套接字工厂启动的包中,执行一些获取 ConfigAdmin 实例的代码并调用类似
Configuration sfc = ca.createFactoryConfiguration("socketFactory", null);
Hashtable<String, Object> props = new Hashtable<String, Object>();
props.put("socketType", "MyType");
sfc.update(props);
如果此代码与 SocketFactory 代码捆绑在一起,您可以省略 null 参数。这将生成一个带有 socketType=MyType 服务属性的 SocketFactory 组件,类似于您对组件属性所做的操作。
在要安排消费者设置的 bundle 中,执行类似的操作但使用目标过滤器:
Configuration cc = ca.createFactoryConfiguration("consumer", null);
Hashtable<String, Object> props = new Hashtable<String, Object>();
props.put("SocketService.target", "(socketType=MyType)");
cc.update(props);
这将生成具有指定目标过滤器的消费者组件。
您也许可以选择使用例如felix fileinstall 从属性文件安装配置。这是非常声明性的,但我没有任何经验,而且我看到有些人很难将所有部分排成一行,因此它可以工作。在工作中,我有幸使用了一个基于 xml 的系统:它从元类型生成一个模式,并将 xml 配置文档(符合生成的模式)与元类型结合以生成配置。它可以从例如生成目标过滤器元素。嵌套的 xml。我经常希望有一个开源版本。
顺便说一句,您可能想重新审视您对 spec ds 注释的回避。它们不在运行时使用,而是在您组装包时由 bnd 处理。 (您正在使用 bnd,不是吗?)。 Bnd 将为与您的组件兼容的尽可能低的 ds 版本生成 component.xml,并且它会比您手动执行更多的验证(至少比我手动执行的要多)。
关于java - 带有组件 XML 文件的 OSGI DeclarativeService Multiton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33171587/
我想使用 li 和 ul 制作一个多级下拉列表,以便显示我博客中按年和月排序的所有文章。我希望我的下拉菜单看起来像 Google Blogspot 下拉菜单: 这是我的 CSS 和 HTML 代码 u
我在 Win 7 64 机器上将 CodeBlocks 与 gcc 4.7.2 和 gmp 5.0.5 结合使用。开始使用 gmpxx 后,我看到一个奇怪的段错误,它不会出现在 +、- 等运算符中,但
我正在使用 tern 为使用 CodeMirror 运行的窗口提供一些增强的智能感知,它工作正常,但我遇到了一个问题,我想添加一些自定义“types”,可以这么说,这样下拉列表中它们旁边就有图标了。我
我正在尝试让我的 PC 成为 Android 2.3.4 设备的 USB 主机,以便能够在不需要实际“附件”的情况下开发 API。为此,我需要将 PC 设置为 USB 主机和“设备”(在我的例子中是运
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我在设置服务器方面几乎是个新手,但遇到了一个问题。我有一个 Ubuntu 16.04 VPS 并安装了 Apache2 和 Tomcat7。我正在为 SSL 使用 LetsEncrypt 和 Cert
我在一个基于谷歌地图的项目上工作了超过 6 个月。我使用的是 Google Maps API V1 及其开发人员 API key 。当我尝试发布应用程序时,我了解到 Google API V1 已被弃
我是 Python 的新手,所以如果我对一些简单的事情感到困惑,请原谅。 我有一个这样的对象: class myObject(object): def __init__(self):
这个问题已经有答案了: How can I access object properties containing special characters? (2 个回答) 已关闭 9 年前。 我正在尝
我有下面的 CSS。我想要的是一种流体/液体(因为缺乏正确的术语)css。我正在为移动设备开发,当我改变模式时 从纵向 View 到陆地 View ,我希望它流畅。现在的图像 在陆地 View 中效
我正在尝试使用可以接受参数的缓存属性装饰器。 我查看了这个实现:http://www.daniweb.com/software-development/python/code/217241/a-cac
这个问题在这里已经有了答案: Understanding slicing (36 个答案) 关闭 6 年前。 以a = [1,2,3,4,5]为例。根据我的直觉,我认为 a[::-1] 与 a[0:
mysqldump -t -u root -p mytestdb mytable --where=datetime LIKE '2014-09%' 这就是我正在做的事情,它会返回: mysqldum
我正在制作销售税计算器,除了总支付金额部分外,其他一切都正常。在我的程序中,我希望能够输入一个数字并获得该项目的税额我还希望能够获得支付的总金额,包括交易中的税金。到目前为止,我编写的代码完成了所有这
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我是否必须进行任何额外的设置才能让 apache-airflow 在任务失败时向我发送电子邮件。我的配置文件中有以下内容(与默认值保持不变): [email] email_backend = airf
这个问题在这里已经有了答案: What does the $ symbol do in VBA? (5 个回答) 3年前关闭。 使用返回字符串(如 Left)的内置函数有什么区别吗?或使用与 $ 相同
我有一个用VB6编写的应用程序,我需要使用一个用.NET编写的库。有什么方法可以在我的应用程序上使用该库吗? 谢谢 最佳答案 这取决于。您可以控制.NET库吗? 如果是这样,则可以修改您的库,以便可以
当我创建一个以 ^ 开头的类方法时,我尝试调用它,它给了我一个错误。 class C { method ^test () { "Hi" } } dd C.new.test; Too m
我已经使用 bower 安装了 angularjs 和 materialjs。 凉亭安装 Angular Material 并将“ngMaterial”注入(inject)我的应用程序,但出现此错误。
我是一名优秀的程序员,十分优秀!