Передача данных при реконфигурации ipojo

У меня проблема с передачей данных между ipojo компонентами во время реконфигурации. Вот пример:

  • Компонент Calcul_1 предоставляет службу расчета для возврата значения (a+b) (например: f(a,b)=> (a+b))
  • Компонент Calcul_2 предоставляет службу расчета для возврата значения (a*b) (например, f(a,b)=> (a*b)).

Эти два компонента реализуют одну и ту же службу вычислений (например, f).

  • Теперь у меня есть компонент CallCalcul, который использует службу расчета Calcul_1. Компонент CallCalcul вызывает f(5,6) в компоненте Calcul_1. Затем CallCalcul component получает значение 11.

Проблема:

  1. Когда Calcul_1 получает значение (5,6) (еще не рассчитано) от CallCalcul, CallCalcul переконфигурируется, меняя коннектор на Calcul_2, т.е. привязывается к Calcul_2. В таком случае, как я могу передать (5,6) от Calcul_1 к Calcul_2 и вернуть (5*6=30) к CallCalcul?

  2. Когда Calcul_1 получает значение (5,6) (и вычисляет их, т.е. 5+6=11) от CallCalcul, CallCalcul переконфигурируется. Как в таком случае передать 11 в Calcul_2 и вернуть это значение в CallCalcul?


person HNT    schedule 19.11.2014    source источник
comment
Сталкивались ли вы с такой проблемой, когда поставщик услуг меняется в середине метода, или это просто сценарий, который, по вашему мнению, может произойти? Кроме того, вводите ли вы свои сервисные зависимости с аннотацией Requires (или эквивалентным xml)?   -  person archz    schedule 19.11.2014
comment
это сценарий, я уверен, что это произойдет. Я внедряю свои сервисные зависимости с помощью Requires . Примечание. Два компонента Calcul_1 и Calcul_2 реализуют один и тот же сервис. Я использую фильтр, чтобы изменить привязку CallCalcul к сервису   -  person HNT    schedule 19.11.2014


Ответы (1)


Насколько я знаю, 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);
    }
}

Если эта функция продолжает работать, ipojo не будет связывать новую службу с myService, даже если ваш фильтр будет изменен. Вы должны поместить вызов службы в другой вспомогательный метод. Это позволит 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);
}
person archz    schedule 19.11.2014
comment
Спасибо за ваш ответ. Но я не понимаю, почему компонент спит, все компоненты приостанавливаются? хотя зависимости между ними нет. - person HNT; 20.11.2014
comment
Вы говорите о вызове thread.sleep()? Это просто пример упрощенного цикла, который вы можете реализовать в runnable (проблема, на которую я хотел указать, возникла бы и без него). Компоненты не приостанавливаются; Я просто имею в виду, что когда метод выполняется в вашем компоненте, ipojo гарантирует, что myService ссылается на тот же экземпляр, пока ваш метод не вернулся. Если вы вызовете myService дважды в одном и том же методе, вы можете быть уверены, что служба вычислений каждый раз будет одинаковой (умножение или сложение, но не каждое из них). - person archz; 20.11.2014
comment
Спасибо за помощь. Я согласен с вами, что требующий компонент будет ждать получения результата перед перенастройкой. Я тестировал с помощью Thread.sleep(), как вы говорили, и это привело к другому issus stackoverflow.com/questions/27039926/. Я хочу создавать независимые компоненты друг друга. :( - person HNT; 20.11.2014
comment
Я повторил ваш пример, но результат тот же. нет разницы между размещением вызова службы в другом вспомогательном методе и нет. - person HNT; 25.11.2014