2013-04-06 72 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