gpt4 book ai didi

OSGi 强制捆绑使用不同的配置启动两次

转载 作者:行者123 更新时间:2023-12-04 23:24:18 25 4
gpt4 key购买 nike

我在我的应用程序中使用嵌入式 Felix。应用程序可能会处理大量暴露类似接口(interface)的插件IFoo .有一个默认实现 FooImpl希望大多数插件默认 FooImpl可以与特定的配置文件一起使用。

当新的配置文件出现时,我想动态安装和启动同一个包(使用 FooImpl )。我已经查看过 FileInstall,但不知道如何在那里应用它。

更新 :部署顺序。装有 FooImpl 的 jar 和 IFoo是稳定的,但我需要将新的 .cfg 文件上传到 FileInstall 范围内的新实例的热部署。所以想要的非常简单——用户上传.cfg,新服务(FooImpl 的实例)就出现了。

最佳答案

使用工厂配置将允许您基于不同的配置创建不同的 FooImpl 实例。

例如,在声明式服务中,您可以创建一个组件,如

import org.apache.felix.scr.annotations.*;
import org.apache.sling.commons.osgi.PropertiesUtil;

@Component(metatype = true,
name = FooImpl.SERVICE_PID,
configurationFactory = true,
specVersion = "1.1",
policy = ConfigurationPolicy.REQUIRE)
public class FooImpl implements IFoo
{
//The PID can also be defined in interface
public static final String SERVICE_PID = "com.foo.factory";

private static final String DEFAULT_BAR = "yahoo";
@Property
private static final String PROP_BAR = "bar";

@Property(intValue = 0)
static final String PROP_RANKING = "ranking";

private ServiceRegistration reg;

@Activate
public void activate(BundleContext context, Map<String, ?> conf)
throws InvalidSyntaxException
{
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put("type", PropertiesUtil.toString(config.get(PROP_BAR), DEFAULT_BAR));
props.put(Constants.SERVICE_RANKING,
PropertiesUtil.toInteger(config.get(PROP_RANKING), 0));
reg = context.registerService(IFoo.class.getName(), this, props);
}

@Deactivate
private void deactivate()
{
if (reg != null)
{
reg.unregister();
}
}
}

这里的关键点是
  • 您使用类型为 configurationFactory 的组件
  • 在 activate 方法中,您读取配置,然后基于该注册服务
  • 在停用时,您明确取消注册服务
  • 然后,最终用户将创建名称为 <pid>-<some name>.cfg 的配置文件.然后 DS 将激活该组件。

  • 然后您可以通过创建名称为 <pid>-<some name>.cfg 的配置文件(使用类似文件安装)来创建多个实例喜欢 com.foo.factory-type1.cfg
    引用 JdbcLoginModuleFactory及其相关的 config举一个这样的例子。

    如果你想通过普通的 OSGi 实现同样的效果,那么你需要注册一个 ManagedServiceFactory .引用 JaasConfigFactory举一个这样的例子。

    这里的关键点是
  • 您使用配置 PID 注册一个 ManagedServiceFactory 实例作为服务属性
  • 在 ManagedServiceFactory(String pid, Dictionary properties) 回调中,根据配置属性
  • 注册 FooImpl 的实例

    关于OSGi 强制捆绑使用不同的配置启动两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15850571/

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