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

时间:2014-08-04 09:28:34

标签: osgi osgi-bundle

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

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

    ServiceRegistration<?> registration = bundlecontext.registerService(
            className, class, null);

但是,我似乎只创建了每个类的一个实例。有解决方法吗?

最好像

    ServiceRegistration<?> registration = bundlecontext.registerService(
            className + "#" + (++counter), new classInstance(), null);

3 个答案:

答案 0 :(得分:3)

请注意,使用带有相应注释的声明式服务可以很容易,这里摘自Apache Sling代码库(ConfiguredFeature.java):

@Component(
        name = "org.apache.sling.featureflags.Feature",
        metatype = true,
        configurationFactory = true,
        policy = ConfigurationPolicy.REQUIRE)
@Service
public class ConfiguredFeature implements Feature {

    @Property(label = "Name", description = "Short name of this feature")
    private static final String NAME = "name";

    private String name;

    @Activate
    private void activate(final Map<String, Object> configuration) {
        this.name = PropertiesUtil.toString(configuration.get(NAME), "");
    }

    ...
}

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

答案 1 :(得分:2)

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

我在这里有一个简单的例子,它使用Felix DependencyManager来注册组件:https://github.com/paulbakker/osgicourse/tree/master/greeterfactory/src/greeterfactory

答案 2 :(得分:1)

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

ServiceRegistration<?> registration = bundlecontext.registerService(
        className, class, null);

registerService的第二个参数是一个对象,而不是一个类。这是您自己实例化的对象。在将它们传递给OSGi之前,您可以以任何您喜欢的方式创建任意数量的内容。

但是,如果您使用外部提供的配置数据执行此操作,则应查看Declarative Services及其从OSGi Configuration Admin服务接收配置的能力。

<强>更新 再看看你的问题,我看到你试图添加到类名的计数器。这不是必需的,事实上也是不允许的。只需多次致电registerService

相关问题