2013-04-06 83 views
4

我在我的应用程序中使用嵌入式Felix。应用程序可能会处理大量插件,这些插件会暴露类似的界面IFoo。默认有一个实现FooImpl希望对于大多数插件,默认FooImpl可以与特定的配置文件一起使用。OSGi强制捆绑包以不同配置启动两次

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

UPDATE:部署顺序。包含FooImplIFoo的jar很稳定,但我需要将新实例的热部署,这些新实例是将新的.cfg文件上传到FileInstall范围的结果。所需的非常简单 - 用户上传.cfg,新服务(FooImpl的实例)出现。

回答

7

使用出厂配置将允许您根据不同的配置创建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(); 
     } 
    } 
} 

要点组件这里是

  1. 您使用类型configurationFactory
  2. 的一个组成部分。在你读取配置的激活方法然后根据该注册服务
  3. 停用您明确取消注册服务
  4. 最终用户将创建名称为<pid>-<some name>.cfg的配置文件。然后DS会激活组件。

然后你就可以通过(使用文件安装等)与名<pid>-<some name>.cfg文件中像com.foo.factory-type1.cfg

参考JdbcLoginModuleFactory及其相关config一个这样的例子创建配置创建多个实例。

如果你想通过普通OSGi实现相同,那么你需要注册一个ManagedServiceFactory。一个这样的例子参考JaasConfigFactory

要点这里是

  1. 您进行配置PID注册ManagedServiceFactory实例作为服务属性
  2. 在ManagedServiceFactory(字符串PID,字典属性)FooImpl的回调登记情况基础上,配置属性
1

听起来像你想要只有一个与FooImpl捆绑安装,但它有注册多个IFoo服务,每个配置一个。查看Declarative Services并使用Config Admin使用工厂配置为DS组件创建多个配置。

+0

请您提供更多详情。我已经添加了部署注释 - 服务应该如何显示在系统中,特别是我无法理解新的显示方式。cfg文件(由FileInstall管理)将引起出现'FooImpl'的新实例 – Dewfy 2013-04-07 07:47:24