OSGI学习笔记一(事件传递)


采用DS声明式服务方式:

一、创建1个sendEvent的OSGI组件工程,定义在组件中传递事件的类sendEvent

package sendEvent;
import java.util.HashMap;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.event.EventConstants;

public class sendEvent {
        EventAdmin eventAdmin;
	
	Event event=null;
	public synchronized void setEventAdmin(EventAdmin eventBus) {  
		eventAdmin = eventBus;  
        	System.out.println("EventAdmin service is set!");  
        }
	public void start()
	{
		HashMap properties = new HashMap();  
                properties.put(EventConstants.BUNDLE_SYMBOLICNAME, "test.first");  
		event=new Event("org/eclipse/equinox/events/MemoryEvent/CRITICAL", properties);
		System.out.println("post event started");
				
		eventAdmin.sendEvent(event);
		
		System.out.println("post event ended");
		 try {  
             		Thread.sleep(5000);  
          	 } catch(InterruptedException e) {}  
	}

}
component.xml的设置:


工程的MANIFEST.MF文件:


其中 org.osgi.service.event.Event;包是一般的开发平台不会自动集成的,需要下载相关的包,设置好才行。


二、创建一个新的OSGI工程,定义事件处理类dealwithevent:


package dealEvent;

import org.osgi.service.event.EventHandler; 
import org.osgi.service.event.Event;

public class dealwithevent implements EventHandler {
	
	
	@Override
	public void handleEvent(Event arg0) {
		// TODO Auto-generated method stub
		System.out.println(arg0.getTopic());
	}

}


 
  
该类是对org.osgi.service.event.EventHandler接口的实现,会自动根据eventAdmin传过来的event根据topic是否匹配进行处理。

工程的MANIFEST.MF文件:


在工程的component.xml的设置中,添加Properites属性:




将该组件提供的服务 org.osgi.service.event.EventHandler 暴露出来



运行平台的配置注意要选上:


ok,运行,sendEvent(event)是同步通信方式
结果:

如果使用的是eventAdmin.postEvent(event); 是异步通信的方式,则运行结果为:





你可能感兴趣的:(OSGI)