OSGI中声明性服务的动态目标

时间:2015-09-25 15:38:32

标签: java dynamic osgi declarative-services

鉴于使用服务的消费者,该消费者如何使用声明性服务动态选择特定提供者?

实施例

Service.java

public interface Service {
    public void do();
}

Provider1.java

public class Provider1 implements Service {    
    @Override
    public void do(){
        //a way 
    }   
}

Provider2.java

public class Provider2 implements Service {    
    @Override
    public void do(){
        //another way 
    }   
}

Consumer.java

public class Consumer {
    private Service myService;

    protected void bindService(Service s){ // Actually it's Provider1
        myService = s;
    }

    protected void unbindService(Service s){
        myService = null;
    }

    public void useThisKindOfService(String s){
        // Do something crazy
    }
}

所以,我希望它能代替"做一些疯狂的事情",找到一种方法来重新配置消费者,以便释放Provider1并要求提供者2。

有可能吗?

与"重复问题"

相关的更新

OSGI/Felix Declarative services: How to filter the services to be bound

在我的上下文中,我不能使用声明性目标,因为必须在构建时知道目标的值,在我的情况下,目标可以由用户在运行时定义。

1 个答案:

答案 0 :(得分:1)

可以通过ConfigurationAdmin配置声明性服务的组件。通过这样做,可以在运行时更改组件的配置。

您还可以在运行时通过ConfigurationAdmin更改 myService.target 的配置。如果这样做,另一个引用将绑定到您的组件。

如果组件引用的策略是动态的,则新引用将被绑定而不重新激活组件。

有关更多信息,请参阅OSGi Compendium规范的声明性服务章节。