鉴于使用服务的消费者,该消费者如何使用声明性服务动态选择特定提供者?
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
在我的上下文中,我不能使用声明性目标,因为必须在构建时知道目标的值,在我的情况下,目标可以由用户在运行时定义。
答案 0 :(得分:1)
可以通过ConfigurationAdmin配置声明性服务的组件。通过这样做,可以在运行时更改组件的配置。
您还可以在运行时通过ConfigurationAdmin更改 myService.target 的配置。如果这样做,另一个引用将绑定到您的组件。
如果组件引用的策略是动态的,则新引用将被绑定而不重新激活组件。
有关更多信息,请参阅OSGi Compendium规范的声明性服务章节。