`
sswh
  • 浏览: 161734 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Felix的一段涂鸦的代码

    博客分类:
  • OSGi
阅读更多

一段涂鸦代码:简易的Felix启动:

 

public static void main(String[] args) throws Exception {
	Map<String, String> properties = new HashMap<String, String>();
	// 仅仅调试用,为了在调试模块访问felix.framework包
	properties.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,//
		"org.apache.felix.framework"// 
				+ ", org.apache.felix.framework.capabilityset"//
	);

	FrameworkFactory factory = new org.apache.felix.framework.FrameworkFactory();
	Framework framework = factory.newFramework(properties);
	// start之后,bundle-cache将会被还原,
	// 并按照bundle是否自动启动、bundle的startlevel以及框架的startlevel进行启动
	// 缓存的bundle不会触发install事件,但会触发start事件
	framework.start();

	// bundles目录下的是永远安装/启动的模块,即:不管模块是否上次在bundle-cache中已经卸载,重启后依然存在
	File[] files = new File("bundles").listFiles();
	List<File> installingFiles = Arrays.asList(files);
	// 排序的目的是保证在不同的环境下具有相同的执行效果;
	// 实践证明,同样的Windows XP系统,listFiles()的返回顺序不同
	// bundle的安装顺序,决定了bundle的id大小,
	// 而bundle.id大小对于package依赖的选取影响重大[当不同bundle导出了相同的package时] 
	Collections.sort(installingFiles);
	List<Bundle> installedBundles = new ArrayList<Bundle>(installingFiles.size());
	for (File file : installingFiles) {
		Bundle bundle = framework.getBundleContext().installBundle(file.toURI().toURL().toString());
		installedBundles.add(bundle);
	}

	for (Bundle bundle : installedBundles) {
		// 不仅启动模块,同时设置为autostart/autostop状态(即:由框架活动startlevel决定)
		bundle.start();
	}

	// 更改后续安装的bundle的缺省startlevel为核心模块缺省startlevel + 100
}

 

观察系统中已注册的所有服务:

@Validate
void start() throws Exception {
	Bundle bundle = FrameworkUtil.getBundle(getClass());
	BundleContext context = bundle.getBundleContext();

	Felix felix = (Felix) context.getBundle(Constants.SYSTEM_BUNDLE_LOCATION);
	Field field = Felix.class.getDeclaredField("m_registry");
	field.setAccessible(true);
	ServiceRegistry registry = (ServiceRegistry) field.get(felix);
	List<ServiceReference> refs = registry.getServiceReferences(null, null);
	Collections.sort(refs);
	Collections.reverse(refs);

	for (ServiceReference ref : refs) {
		System.out.println(ref + " in " + ref.getBundle());
		for (String key : ref.getPropertyKeys()) {
			Object value = ref.getProperty(key);
			if (value != null && value.getClass().isArray()) {
				value = Arrays.toString((Object[]) value);
			}
			System.out.println(key + " : " + value);
		}
		System.out.println();
	}
}

 

分享到:
评论
5 楼 sswh 2014-08-18  
ipojo运行时注册的服务2:

[org.apache.felix.ipojo.extender.ExtensionDeclaration] in org.apache.felix.ipojo [4]
ipojo.extension.name : component
objectClass : [org.apache.felix.ipojo.extender.ExtensionDeclaration]
service.id : 19

[org.apache.felix.ipojo.extender.ExtensionDeclaration] in org.apache.felix.ipojo [4]
ipojo.extension.name : handler
objectClass : [org.apache.felix.ipojo.extender.ExtensionDeclaration]
service.id : 20

若干个TypeDeclaration:
[org.apache.felix.ipojo.extender.TypeDeclaration] in org.apache.felix.ipojo [4]
objectClass : [org.apache.felix.ipojo.extender.TypeDeclaration]
service.id : 21

若干个HandlerFactory:
[org.apache.felix.ipojo.HandlerFactory] in org.apache.felix.ipojo [4]
component.description : factory name="controller" bundle="4" state="valid"
	requiredhandlers list="[]"
	missinghandlers list="[]"
component.properties : []
component.providedServiceSpecifications : []
factory.name : controller
factory.state : 1
handler.name : controller
handler.namespace : org.apache.felix.ipojo
handler.type : primitive
objectClass : [org.apache.felix.ipojo.HandlerFactory]
service.id : 32
service.pid : controller

4 楼 sswh 2014-08-18  
ipojo运行时注册的服务:

[org.osgi.service.cm.ConfigurationListener] in org.apache.felix.ipojo [4]
objectClass : [org.osgi.service.cm.ConfigurationListener]
service.description : iPOJO Configuration Admin Listener
service.id : 15
service.vendor : The Apache Software Foundation

[org.apache.felix.ipojo.extender.queue.QueueService] in org.apache.felix.ipojo [4]
ipojo.queue.mode : sync
objectClass : [org.apache.felix.ipojo.extender.queue.QueueService]
service.id : 16

[org.apache.felix.ipojo.extender.queue.QueueService, org.osgi.service.cm.ManagedService] in org.apache.felix.ipojo [4]
ipojo.queue.mode : async
objectClass : [org.apache.felix.ipojo.extender.queue.QueueService, org.osgi.service.cm.ManagedService]
org.apache.felix.ipojo.extender.ThreadPoolSize : 1
service.id : 17
service.pid : org.apache.felix.ipojo.extender.ExecutorQueueService

[org.apache.felix.ipojo.extender.DeclarationBuilderService] in org.apache.felix.ipojo [4]
objectClass : [org.apache.felix.ipojo.extender.DeclarationBuilderService]
service.id : 18
3 楼 sswh 2014-08-18  
gogo runtime注册的服务:

gogo shell注册的服务:

略。
2 楼 sswh 2014-08-18  
gogo command注册的服务:
[org.apache.felix.gogo.command.Basic] in org.apache.felix.gogo.command [1]
objectClass : [org.apache.felix.gogo.command.Basic]
osgi.command.function : [bundlelevel, frameworklevel, headers, help, install, lb, log, refresh, resolve, start, stop, uninstall, update, which]
osgi.command.scope : felix
service.id : 3

[org.apache.felix.gogo.command.Inspect] in org.apache.felix.gogo.command [1]
objectClass : [org.apache.felix.gogo.command.Inspect]
osgi.command.function : [inspect]
osgi.command.scope : felix
service.id : 4

[org.apache.felix.gogo.command.Files] in org.apache.felix.gogo.command [1]
objectClass : [org.apache.felix.gogo.command.Files]
osgi.command.function : [cd, ls]
osgi.command.scope : felix
service.id : 5

[org.apache.felix.gogo.command.OBR] in org.apache.felix.gogo.command [1]
objectClass : [org.apache.felix.gogo.command.OBR]
osgi.command.function : [deploy, info, javadoc, list, repos, source]
osgi.command.scope : obr
service.id : 6
1 楼 sswh 2014-08-18  
Felix框架注册的服务:

[org.osgi.service.packageadmin.PackageAdmin] in org.apache.felix.framework [0]
objectClass : [org.osgi.service.packageadmin.PackageAdmin]
service.id : 1

[org.osgi.service.startlevel.StartLevel] in org.apache.felix.framework [0]
objectClass : [org.osgi.service.startlevel.StartLevel]
service.id : 2

相关推荐

Global site tag (gtag.js) - Google Analytics