动态OSGi服务替代作为开发辅助

时间:2014-01-09 23:37:30

标签: java osgi apache-felix

我们正在使用Apache Felix注释来处理我们应用程序中的所有OSGi内容。我有一个与服务器通信的提供程序类。我有一个消费者类,用来处理来自服务器的数据。我想要的是创建另一个提供者实例(新类实现接口),仅用于调试目的,返回消费者对请求的预设响应。理想情况下,我希望消费者不知道这种切换。它的提供者服务参考将被简单地替换。

用例:当开发人员在无法访问实际服务器的计算机上运行时,他按下我们正在运行的应用程序中的按钮,从真实的提供程序实例切换到我们的调试提供程序实例。

推荐的方法是什么?

示例代码:

public interface IProvider{
    public String getDataFromServer();
}


@Component
@Service(value=IProvider.class)
public class RealProvider implements IProvider{
    @Override
    public String getDataFromServer(){
        ...
    }
}


@Component
@Service(value=IProvider.class)
public class DebugProvider implements IProvider{
    @Override
    public String getDataFromServer(){
        return "Hello World";
    }
}


@Component
public class Consumer{
    private @Reference IProvider provider;

    public void doSomething(){
        provider.getDataFromServer();
    }
}

1 个答案:

答案 0 :(得分:0)

如果两个提供商位于不同的捆绑包中,您可以停止捆绑A并启动捆绑包B以在服务的实现之间切换。

如果两个提供程序位于同一个包中,则需要下拉到OSGI API并手动注册/取消注册服务,或者创建具有debugMode标志的IProvider代理版本并委托给特定的实施