更新IPOJO组件实现

时间:2014-11-10 13:15:44

标签: java ipojo

我还有另一个与iPOJO中的动态更新有关的问题:

1。问题:

  • 假设我有2个组件A和B.这两个组件分别由A_impl.java和B_impl.java实现。他们实现了两个服务A_service和B_service。
  • 组件“C”使用A_service声明如下:

//

@Component(name="C", immediate=true)
@Instantiate
public class C_impl {
        @Requires
        A_Service service;
}

//

  • 所有三个组件都已部署并正常运行。

2。要求:

  • 现在,我想动态更新" C"通过将C_impl.java中的依赖类型(@Requires A_service服务)更改为(@Requires B_service服务),即它在运行时将A_service更改为C_impl中的B_service。

问题

如何开发独立组件以重新配置(控制)组件实施?我读过(http://felix.apache.org/site/dive-into-the-ipojo-manipulation-depths.html),但我不太了解。 在此先感谢您的回复

1 个答案:

答案 0 :(得分:1)

那么,您想要更改组件的组件类吗?这不会真的有效。

唯一的方法是让两个实现在没有声明实例的情况下可用(没有@instantiate),并创建一个需要Factories(org.apache.felix.ipojo.Factory服务)的组件,并在需要时创建实例。显然,如果你需要替换,你还需要在创建第二个时创建第一个创建的实例。

所以,它需要一个像这样的组件(这是伪代码):

@Component(immediate=true)
@Instantiate
public class Controller {

    @Requires(filter="(factory.name=A)")
    Factory factoryOfA;

    @Requires(filter="(factory.name=B)")
    Factory factoryOfB;    

    ComponentInstance instance;

    @Validate
    public void createA() throws Exception {
        instance = factoryOfA.createInstance(null);
    }

    public void switchToB() throws Exception {
        instance.dispose();
        instance = factoryOfB.createInstance(null);
    }
}