2017-12-01 37 views
0

사용자가 코드를 플러그인하여 센서를 모니터링 할 수있는 시스템을 작성 중입니다.OSGI serviceChanged 메서드

다른 번들의 변경 사항을 수신하는 기본 수신기를 작성하려고합니다. 나는 ServiceListener를 찾았는데, 이는 내 원인으로보기에 편리하다. 내 질문은 : serviceListener에서 serviceChanged()를 호출 할 때가? 나는 인터넷에서 그것을 찾고 있었지만 아무것도 찾을 수 없었다.

감사합니다.

package be.pxl.smartcampus.MonitorListener; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceListener; 
import org.osgi.framework.ServiceEvent; 
import be.pxl.smartcampus.util.Monitor; 
import be.pxl.smartcampus.util.Data; 

public class Activator implements BundleActivator, ServiceListener { 

    public void start(BundleContext context) { 
     context.addServiceListener(this); 
    } 

    public void stop(BundleContext context) { 
     context.removeServiceListener(this); 
    } 

    public void serviceChanged(ServiceEvent event) { 
     if (event.getType() == ServiceEvent.MODIFIED) { 
      Monitor monitor = (Monitor) (event.getServiceReference()); 
      Data data = monitor.getData(); 
      System.out.println("SERVICE CHANGED CALLED"); 
      // TO DO: MAKE API CALL 
     } 
    } 
} 

import be.pxl.smartcampus.util.Data; 
import be.pxl.smartcampus.util.Monitor; 
import org.osgi.framework.BundleContext; 

import java.util.Hashtable; 

public class Activator extends Monitor { 

    private Data data = new Data(); 
    private Hashtable<String, Data> hash = new Hashtable<String, Data>(); 

    public void start(BundleContext bundleContext) { 
     hash.put("first", data); 
     bundleContext.registerService(Activator.class.getName(), this, hash); 
     changeData(); 
    } 

    private void changeData() { 
     hash.put("second", data); 
    } 

    public void stop(BundleContext bundleContext) { 

    } 
} 

답변

0

여기에는 2 가지 개념 (번들 및 서비스)이 혼합되어 있습니다.

번들은 수명주기가있는 Jar 파일입니다 (동적으로 설치, 해결, 시작, 중지 및 제거 할 수 있음). 번들 라이프 사이클을 추적하려면 번들 라이프 사이클 이벤트가 발생할 때 BundleListener을 호출해야합니다.

또는 당신은 단지 몇 가지 특별한 정보 (특수 파일, MANIFEST.MF 특별 항목, ...) 당신이 Extender Pattern

서비스 구성 요소 (클래스)입니다 사용할 수를 포함하는 특정 번들 뭔가를해야하는 경우 OSGi 서비스 레지스트리에 등록되어 다른 서비스가이를 찾을 수 있도록 묶음 안에 살고있다. 서비스는 자체 수명주기가 있습니다 (시작, 중지, ...). 구현 및 등록해야하는 서비스주기 이벤트를 추적하려는 경우서비스 수명주기 이벤트가 발생할 때 호출됩니다 (서비스가 시작, 중지됨, ...).). ServiceEvent에는 이벤트를 유발 한 실제 서비스 및 변경 유형에 대한 정보가 들어 있습니다.

또는 특정 유형의 서비스로 뭔가를 수행하는 경우에만 Whiteboard Pattern을 사용할 수 있습니다.

+0

답변 해 주셔서 감사합니다. serviceListeners를 사용하고 있지만 작동하지 않습니다. 내 질문을 편집했습니다. 보시다시피 저는 소품이 수정되었을 때 약간의 코드를 실행하고 싶습니다. 그러나 hash.put ("second", data)이 실행되면 serviceChanged 이벤트가 호출되지 않습니까? –

1

일부 해시 테이블의 내용을 변경하는 것만으로는 충분하지 않습니다. ServiceRegistration 개체에서 setProperties으로 전화해야합니다.