OSGi如何运行一个服务的多个实例

OSGi如何运行一个服务的多个实例,osgi,osgi-bundle,Osgi,Osgi Bundle,是否可以在osgi框架中运行同一服务的多个实例? 更具体地说,我需要启动一个服务的多个实例,但每个实例应该接收不同的参数。这是因为这些服务具有类似的功能。但是,我不想为每个变体编写服务,而是希望重用一个实现类 我已经在框架api中找到了registerService方法 ServiceRegistration<?> registration = bundlecontext.registerService( className, class, null)

是否可以在osgi框架中运行同一服务的多个实例? 更具体地说,我需要启动一个服务的多个实例,但每个实例应该接收不同的参数。这是因为这些服务具有类似的功能。但是,我不想为每个变体编写服务,而是希望重用一个实现类

我已经在框架api中找到了registerService方法

    ServiceRegistration<?> registration = bundlecontext.registerService(
            className, class, null);
ServiceRegistration注册=bundlecontext.registerService(
类名称,类,空);
然而,我似乎只为每个类创建一个实例。有解决办法吗

最好是像这样的

    ServiceRegistration<?> registration = bundlecontext.registerService(
            className + "#" + (++counter), new classInstance(), null);
ServiceRegistration注册=bundlecontext.registerService(
className+“#”+(++计数器),新classInstance(),null);

您可以创建ManagedServiceFactory。工厂可以为configuration Admin中的每个配置集注册新服务


这里有一个简单的例子,它使用Felix DependencyManager注册组件:

您可以创建一个ManagedServiceFactory。工厂可以为configuration Admin中的每个配置集注册新服务


我这里有一个简单的例子,它使用Felix DependencyManager注册组件:

您的参数有点错误,或者至少有误导性:

ServiceRegistration<?> registration = bundlecontext.registerService(
        className, class, null);
ServiceRegistration注册=bundlecontext.registerService(
类名称,类,空);
registerService
的第二个参数是对象,而不是类。这是您自己实例化的对象。在将它们传递给OSGi之前,您可以以任何方式创建任意数量的对象

但是,如果您使用外部提供的配置数据执行此操作,则应该研究声明性服务及其从OSGi配置管理服务接收配置的能力

更新
再看看你的问题,我看到了你试图添加到类名中的计数器。这是不需要的,事实上也是不允许的。只需多次调用注册表服务。

您的参数有点错误,或者至少有误导性:

ServiceRegistration<?> registration = bundlecontext.registerService(
        className, class, null);
ServiceRegistration注册=bundlecontext.registerService(
类名称,类,空);
registerService
的第二个参数是对象,而不是类。这是您自己实例化的对象。在将它们传递给OSGi之前,您可以以任何方式创建任意数量的对象

但是,如果您使用外部提供的配置数据执行此操作,则应该研究声明性服务及其从OSGi配置管理服务接收配置的能力

更新
再看看你的问题,我看到了你试图添加到类名中的计数器。这是不需要的,事实上也是不允许的。只需多次调用registerService。

注意,使用带有相应注释的声明性服务使这变得非常容易,下面是Apache Sling代码库()的一个摘录:

@组件(
name=“org.apache.sling.featureflags.Feature”,
元类型=真,
configurationFactory=true,
policy=ConfigurationPolicy.REQUIRE)
@服务
公共类ConfiguredFeature实现功能{
@属性(label=“Name”,description=“此功能的简称”)
私有静态最终字符串NAME=“NAME”;
私有字符串名称;
@激活
专用无效激活(最终地图配置){
this.name=PropertiesUtil.toString(configuration.get(name),“”);
}
...
}

使用
configurationFactory=true
policy=ConfigurationPolicy.REQUIRE
会为每个相应的OSGi配置创建此服务的一个实例,这是创建多个实例的一种自然方式。

请注意,使用带有相应注释的声明性服务使这非常容易,下面是Apache Sling代码库()的摘录:

@组件(
name=“org.apache.sling.featureflags.Feature”,
元类型=真,
configurationFactory=true,
policy=ConfigurationPolicy.REQUIRE)
@服务
公共类ConfiguredFeature实现功能{
@属性(label=“Name”,description=“此功能的简称”)
私有静态最终字符串NAME=“NAME”;
私有字符串名称;
@激活
专用无效激活(最终地图配置){
this.name=PropertiesUtil.toString(configuration.get(name),“”);
}
...
}

使用
configurationFactory=true
policy=ConfigurationPolicy.REQUIRE
会为每个相应的OSGi配置创建此服务的一个实例,这是创建多个实例的自然方式。

我对OSGi比较陌生,所以我还不太了解。但是目标平台中不包括“org.apache.felix.dm”和“org.osgi.service.cm”。我在哪里可以找到它们以及如何添加它们?我对osgi比较陌生,所以我还不太了解。但是目标平台中不包括“org.apache.felix.dm”和“org.osgi.service.cm”。我在哪里可以找到它们以及如何添加它们?