【问题标题】:Update IPOJO component implementation更新 IPOJO 组件实现
【发布时间】:2014-11-10 13:15:44
【问题描述】:

我还有一个与 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_impl.java 中的依赖类型(@Requires A_service 服务)更改为(@Requires B_service 服务)来动态更新“C”的实现,即它在运行时将 C_impl 中的 A_service 更改为 B_service。

问题

如何开发独立组件来重新配置(控制)组件实现?我读过 (http://felix.apache.org/site/dive-into-the-ipojo-manipulation-depths.html) 但我不太明白。 提前感谢您的回复

【问题讨论】:

    标签: java ipojo


    【解决方案1】:

    嗯,你想改变一个组件的组件类吗?这真的行不通。

    唯一的方法是让两个实现在没有声明实例的情况下可用(没有@instantiate),并创建一个需要两个工厂(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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多