2016-08-04 4 views
0
나는 (의사 코드)이 구성 요소가

의 동적 추가를 처리하기 위해 : 구성 요소가 활성화 될 때가장 좋은 방법은 서비스

@Component 
class ServiceComponent { 
    Set<MyService> set = synchronizedSet(); 

    @Activate 
    activate(){... process set...} 

    @Reference 
    addService(MyService service){set.add(service)} 
} 

자, 처음에, 그것은이면 MyService의 사용 가능한 모든 인스턴스를 추가해야합니다. 하지만 구성 요소가 활성화 된 후 추가 기능을 처리하는 방법은 무엇입니까?

답변

0

실제로 참조로 카디널리티가 기본적으로 1..1이므로 실제로 작성한 코드의 인스턴스는 MyService입니다.

@Reference(cardinality = ReferenceCardinality.MULTIPLE, 
      policy = ReferencePolicy.DYNAMIC) 
void addService(MyService service) { 
    set.add(service); 
} 

곰을 염두에두고이 방법은 후 또는 심지어 activate() 방법 중에 호출 할 수있다 :

다음과 같이 참조 선언을 변경, 모든 인스턴스에 바인딩합니다.

+0

네, 그게 내가 의사 코드라고 쓴 이유입니다. 혼란스러워서 죄송 합니다만, 서비스 추가/제거의 동적 인 동작을 가장 잘 다루는 방법. 예를 들어, Eclipse JFace에서 관찰 가능한 목록을 사용하여 구성 요소가 활성화 된 후에 세트가 변경되면이를 청취합니다. 하지만 순수한 OSGi에는 몇 가지 모범 사례가 있습니까? –

+0

이것은 코드가이 정보와 관련하여 무엇을 필요로하는지에 달려 있습니다. –

+0

관찰 할 수있는 SWT/JFace를 사용한다면'addService' 메서드가 호출 될 스레드를 예측할 수 없다는 것을 명심하십시오. 따라서이 방법으로 UI를 직접 업데이트 할 수는 없습니다. 추가 된 서비스로 인해 UI를 변경하려면'Display.asyncExec'를 사용해야합니다. Swing에서 해당하는 것은'SwingUtilities.invokeLater'입니다. –

0

최신 DS 버전에서는 필드 주석을 사용할 수 있습니다. 휘발성으로 필드를 지정하면 새 서비스가 시작될 때 필드가 업데이트됩니다.

@Reference 
volatile Set<MyService> services;