0

再構成中のコンポーネント間のデータ転送に関連する問題がありますipojo。次に例を示します。

  • コンポーネントCalcul_1は、値を返す計算サービスを提供します(a+b)(例: f(a,b)=> (a+b))
  • コンポーネントCalcul_2は、値を返す計算サービスを提供します(a*b)(例: f(a,b)=> (a*b))

これら 2 つのコンポーネントは、同じ計算サービスを実装します (例: f)。

  • CallCalculこれで、の計算サービスを使用するコンポーネントができましたCalcul_1。コンポーネントはコンポーネントCallCalculを呼び出しf(5,6)ますCalcul_1。次に、CallCalcul componentは値 11 を受け取ります。

問題:

  1. Calcul_1から値を受け取った(5,6)(まだ計算していない)場合はCallCalculCallCalculコネクタをCalcul_2に変更して再構成します。つまり、 にバインドしCalcul_2ます。この場合、 から に送信(5,6)Calcul_1Calcul_2に戻る(5*6=30)にはどうすればよいCallCalculですか?

  2. Calcul_1から値を受け取る(5,6)(そしてそれらを計算する、つまり 5+6=11) とCallCalculCallCalcul再構成します。11この場合、この値を に送信しCalcul_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 に答える