2014-11-19 6 views
0

재구성 중에 ipojo 구성 요소 간의 데이터 전송 관련 문제가 있습니다.ipojo 재구성 중에 데이터 전송

  • 컴포넌트 Calcul_1는 값 (a+b) (예 : f(a,b)=> (a+b))를 반환 계산 서비스를 제공 여기의 예이다 :
  • 컴포넌트 Calcul_2는 값 (a*b) (f(a,b)=> (a*b) 예)을 반환 계산 서비스를 제공

이 두 구성 요소는 동일한 계산 서비스 (예 : f)를 구현합니다.

  • 이제 계산 서비스 Calcul_1을 사용하는 구성 요소 CallCalcul이 있습니다. 구성 요소 CallCalculCalcul_1 구성 요소에 f(5,6)을 호출합니다. 그리고, CallCalcul component이 값을 수신한다 (11)

문제점 :

  1. Calcul_1CallCalcul의 값 (5,6) (아직 계산되지 않음) Calcul_2에 커넥터를 변경함으로써 CallCalcul 재구성, 즉 수신하고, 그것을 Calcul_2에 바인딩됩니다. 이 경우 (5,6)Calcul_1에서 Calcul_2으로 전송하고 (5*6=30)에서 CallCalcul으로 어떻게 전송할 수 있습니까?

  2. Calcul_1(5,6) 값을 수신

    (및를 계산, 즉 5 = 11 + 6) CallCalcul에서 CallCalcul 재구성. 이 경우 11Calcul_2에 어떻게 전송하고이 값을 CallCalcul으로 되돌릴 수 있습니까?

+0

실제로 서비스 제공 업체가 변경되는 중간에 문제가 발생 했습니까? 아니면 실제로 발생할 수 있다고 생각되는 시나리오입니까? 또한 서비스 의존성에'Requires' 주석 (또는 동등한 XML)을 주입합니까? – archz

+0

이것은 이것이 일어날 것이라고 확신하는 시나리오입니다. 나는 서비스 의존성에 Requires를 주입한다. 참고 : Calcul_1과 Calcul_2의 두 구성 요소는 동일한 서비스를 구현합니다. 필터를 사용하여 서비스에 CallCalcul의 바인딩을 변경하십시오. – HNT

답변

0

내가 아는 한, ipojo는 이러한 동작이 일어나지 않도록 동기화를 처리합니다. ipojo documentation 가입일

: 동기화가 iPOJO 의해 관리

. 메서드에 대한 의존성을 만지 자마자 iPOJO는 메서드가 끝날 때까지 이러한 객체를 유지할 것을 보장합니다. 중첩 된 메소드는 동일한 서비스 오브젝트 세트를 공유합니다.

그래서만큼 당신이 같은 방법으로 (또는 중첩 방법)에, 당신은 당신의 서비스가 당신이 그것을 액세스 처음 이후 변경되지 않았 음을 알고있다 (I는 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); 
} 
+0

응답 해 주셔서 감사합니다. 하지만 난 왜 구성 요소가 잠을, 모든 구성 요소가 일시 중지 이해가 안돼? 그들 사이에 의존성은 없지만. – HNT

+0

thread.sleep()에 대한 호출에 대해 이야기하고 있습니까? 이는 실행 가능한 환경에서 구현할 수있는 단순한 루프의 예일뿐입니다. 구성 요소가 "일시 중지"되지 않습니다. 메소드에서 컴포넌트가 실행 중일 때, ipojo는 메소드가 반환되지 않는 한 myService가 동일한 인스턴스를 참조하는지 확인합니다. 동일한 메소드에서'myService'를 두 번 호출하면 계산 서비스가 매번 같아 질 수 있습니다 (곱셈 또는 덧셈이지만 각각 하나가 아님). – archz

+0

도움 주셔서 감사합니다. 구성을 요구하기 위해서는 재구성하기 전에 결과를 받기까지 기다려야한다는 점에 동의합니다. 나는 당신이 말한 것처럼 Thread.sleep()을 사용하여 테스트했고 다른 issus http://stackoverflow.com/questions/27039926/sleep-a-ipojo-component-all-disable로 이어진다. 나는 서로 독립적 인 구성 요소를 만들고 싶다. : ( – HNT