gpt4 book ai didi

java - 将运行时参数传递给 OSGi felix scr 注释中的服务

转载 作者:行者123 更新时间:2023-12-01 20:19:49 27 4
gpt4 key购买 nike

我正在开发一个公开服务的 OSGi 应用程序(带有 felix scr 注释)。服务通过传递字符串值向外部 api 注册。

listener.addSchemaChangeListener(new ChangeListener()
{
@Override
public void schemaChange(ChangeEvent changeEvent)
{
String schemaName = changeEvent.getSchemaName();

if (null != myBuilder && schemaList.contains(schemaName))
{
initVariables();
}
}
}, "SCHEMA1");

服务使用上面的代码来注册多个值“SCHEMA1”、“SCHEMA1”、“SCHEMA3”...的监听器我计划在各种 bundle 中重用此服务。但我只想监听 SCHEMA1 更改而不是全部更改。

@Reference (name = "ServiceListener"", policy = ReferencePolicy.DYNAMIC, cardinality = ReferenceCardinality.MANDATORY_UNARY, bind = "bind", unbind = "unbind", referenceInterface = ServiceListener.class) private AtomicReference myServiceListener = new AtomicReference<>();

如果我尝试在另一个带有 @Reference 的服务中使用它,则没有规定将值传递给服务以仅监听特定的架构更改,以便通过仅传递要监听的模式列表而不是全部,可以在我的包中恢复该服务。因为一旦服务在使用类(组件)中正确绑定(bind),就会调用 activate 方法。OSGi 中是否有任何规定可以实现此功能?

最佳答案

您对应用程序实际工作方式的描述非常少,这使得这个问题很难回答。

从您共享的代码来看,您似乎遵循了非常糟糕的模式。监听器模式是许多同步问题和内存泄漏的根源,当您使用 OSGi 时,应该首选白板模式。

白板模式非常简单。您不需要让每个监听器查找服务并向其注册,而是反转模型。事件源(在本例中是架构更改)查找在 OSGi 服务注册表中注册的监听器服务。这样,监听器的编写和过滤就很简单,并且代码中不存在困惑且容易出错的添加/删除监听器逻辑。

更好的模型将使用服务属性来选择特定模式,并且看起来像这样(使用标准 OSGi 注释)。

监听器 1(监听 SCHEMA1 的更改)

@Component(
property="schemaName=SCHEMA1")
public class MyListener implements ChangeListener {
// Your implementation in here
}

监听器 2(监听 SCHEMA1、SCHEMA2 和 SCHEMA3 的更改)

@Component(
property={"schemaName=SCHEMA1",
"schemaName=SCHEMA2",
"schemaName=SCHEMA3"})
public class MyListener implements ChangeListener {
// Your implementation in here
}

Schema1 的事件源示例:

@Component
public class MyListener implements ChangeListener {

@Reference(policy=DYNAMIC, target="(schemaName=SCHEMA1)")
private final List<ChangeListener> listeners = new CopyOnWriteArrayList<>();

private void onSchemaChange(ChangeEvent event) {
listeners.forEach(l -> l.schemaChange(event);
}

// Rest of your implementation in here
}

关于java - 将运行时参数传递给 OSGi felix scr 注释中的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45095701/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com