是否可以在osgi框架中运行同一服务的多个实例? 更具体地说,我需要启动服务的多个实例,但每个实例都应该接收不同的参数。这是因为服务具有类似的功能。但是我没有为每个变体编写服务,而是想重用一个实现类。
我已经在框架api中找到了registerService方法。
ServiceRegistration<?> registration = bundlecontext.registerService(
className, class, null);
但是,我似乎只创建了每个类的一个实例。有解决方法吗?
最好像
ServiceRegistration<?> registration = bundlecontext.registerService(
className + "#" + (++counter), new classInstance(), null);
答案 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 = true
和policy = 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
。