OSGI 中声明式服务的动态目标
Dynamic target for declarative service in OSGI
给定一个使用服务的消费者,这个消费者如何 select 一个特定的提供者动态地使用声明式服务?
例子
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
}
}
所以,我想要的不是 "Do something crazy",而是找到一种重新配置消费者的方法,以便发布 Provider1 并请求 Provider2。
可能吗?
与 "Duplicate Question"
相关的更新
OSGI/Felix Declarative services: How to filter the services to be bound
在我的上下文中,我不能使用声明性目标,因为必须在构建时知道目标的值,在我的情况下,目标可以由用户在运行时定义。
声明式服务的组件可以通过 ConfigurationAdmin 配置。通过这样做,可以在运行时更改组件的配置。
您还可以在运行时通过 ConfigurationAdmin 更改 myService.target 的配置。如果这样做,另一个引用将绑定到您的组件。
如果您的组件的引用策略是动态的,则无需重新激活您的组件即可绑定新的引用。
有关详细信息,请参阅 OSGi Compendium 规范的声明性服务一章。
给定一个使用服务的消费者,这个消费者如何 select 一个特定的提供者动态地使用声明式服务?
例子
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
}
}
所以,我想要的不是 "Do something crazy",而是找到一种重新配置消费者的方法,以便发布 Provider1 并请求 Provider2。
可能吗?
与 "Duplicate Question"
相关的更新OSGI/Felix Declarative services: How to filter the services to be bound
在我的上下文中,我不能使用声明性目标,因为必须在构建时知道目标的值,在我的情况下,目标可以由用户在运行时定义。
声明式服务的组件可以通过 ConfigurationAdmin 配置。通过这样做,可以在运行时更改组件的配置。
您还可以在运行时通过 ConfigurationAdmin 更改 myService.target 的配置。如果这样做,另一个引用将绑定到您的组件。
如果您的组件的引用策略是动态的,则无需重新激活您的组件即可绑定新的引用。
有关详细信息,请参阅 OSGi Compendium 规范的声明性服务一章。