4

アプリケーションに組み込みの Felix を使用しています。アプリケーションは、同様のインターフェースを公開する多くのプラグインを処理できる可能性がありますIFoo。デフォルトの実装がありますFooImplうまくいけば、ほとんどのプラグインのデフォルトFooImplは特定の構成ファイルで使用できます。

FooImpl新しい構成ファイルが表示されたときに、同じバンドル ( を使用) を動的にインストールして開始したいと思います。私はすでに FileInstall をレビューしましたが、そこに適用する方法がわかりません。

更新: 展開シーケンス。FooImplを含むjarIFooは安定していますが、新しい.cfgファイルをFileInstallのスコープにアップロードした結果である新しいインスタンスのホットデプロイが必要です。ユーザーが .cfg をアップロードすると、新しいサービス (のインスタンスFooImpl) が表示されます。

4

2 に答える 2

7

Factory Configurations を使用すると、さまざまな構成に基づいて 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. activate メソッドでは、構成を読み取り、それに基づいてサービスを登録します
  3. 非アクティブ化では、サービスを明示的に登録解除します
  4. エンド ユーザーは、名前で構成ファイルを作成します<pid>-<some name>.cfg。その後、DS はコンポーネントを有効にします。

<pid>-<some name>.cfg次に、次のような名前の構成ファイルを (File Install などを使用して) 作成することにより、複数のインスタンスを作成できます。com.foo.factory-type1.cfg

そのような例については、 JdbcLoginModuleFactoryとそれに関連する構成を参照してください。

プレーンな OSGi を介して同じことを実現したい場合は、ManagedServiceFactoryを登録する必要があります。そのような例については、 JaasConfigFactoryを参照してください。

キーポイントはここにあります

  1. サービス プロパティとして構成 PID を使用して ManagedServiceFactory インスタンスを登録します。
  2. ManagedServiceFactory(String pid, Dictionary properties) コールバックで、構成プロパティに基づいて FooImpl のインスタンスを登録します。
于 2013-04-08T05:52:21.367 に答える
1

FooImpl がインストールされたバンドルを 1 つだけ持ちたいが、構成ごとに 1 つずつ、複数の IFoo サービスを登録したいようです。Declarative Services を確認し、Config Admin でファクトリ構成を使用して、DS コンポーネントの複数の構成を確立します。

于 2013-04-06T13:20:18.130 に答える