0

在重新配置期间,我遇到了与组件之间的数据传输相关的问题ipojo。这是一个例子:

  • 组件Calcul_1提供计算服务以返回值(a+b)(例如f(a,b)=> (a+b):)
  • 组件Calcul_2提供计算服务以返回值(a*b)(例如f(a,b)=> (a*b):)

这两个组件实现了相同的计算服务(例如:)f

  • 现在,我有一个CallCalcul使用计算服务的组件Calcul_1。组件在组件中CallCalcul调用。然后,接收值 11。f(5,6)Calcul_1CallCalcul component

问题:

  1. Calcul_1从 接收到值(5,6)(尚未计算)时CallCalculCallCalcul通过将连接器更改为 重新配置Calcul_2,即它绑定到Calcul_2。在这种情况下,我如何(5,6)Calcul_1to传输Calcul_2和返回(5*6=30)to CallCalcul

  2. Calcul_1从 接收到值(5,6)(并计算它们,即 5+6=11)时CallCalculCallCalcul重新配置。在这种情况下,我怎样才能传输11Calcul_2返回这个值CallCalcul呢?

4

1 回答 1

0

据我所知, ipojo 处理同步以便不会发生这种行为。

ipojo 文档

同步由 iPOJO 管理。一旦你在一个方法中“接触”了一个依赖,iPOJO 确保你将保留这些对象直到方法结束。嵌套方法将共享相同的服务对象集。

所以只要你在同一个方法(或嵌套方法),你就知道你的服务自从你第一次访问它之后就没有被修改过(我假设你的调用f是同步的,所以告诉我我是否错了)。在方法调用过程中,Calcul_1组件不会被替换。Calcul_2

但是,我想这也意味着如果您希望重新配置生效,您必须使用您的服务到达方法的末尾。例如,如果您的组件启动具有以下功能的线程:

public void run() {
    while(!end) {
        //while this function is running, myService will not change
        int var = myService.f(a,b); 
        // ... do something with the result
        Thread.sleep(SLEEP_TIME);
    }
}

如果此功能继续运行,myService即使您的过滤器被修改,ipojo 也不会绑定新服务。您应该将对该服务的调用放在另一个辅助方法中。它将允许 ipojo 在重新配置您的组件时锁定对服务的访问。例如 :

public void run() {
    while(!end) {
        // the service may not be the same each time because this function does
        // not directly use the service
        int var = callDynamicService(a,b); 
        // ... do something with the result
        Thread.sleep(SLEEP_TIME);
    }
}

private int callDynamicService(int a, int b) {
    return myService.f(a,b);
}
于 2014-11-19T17:49:37.470 回答