你们也在用osgi吗?
模块化的规范
在Java中现在是没有一个模块化的概念的,或者说没有一个事实上的标准。就是如何组成一个模块,然后哪些模块是给内部使用,哪些模块是给外部使用的。
OSGI就可以解决上面的问题,应用程序可以像搭积木一样完成搭建,例如对于一个正在运行的系统,压根日志服务,但目前系统中没有提供日志服务的模块,那么可以直接开发出相应的日志服务模块,然后动态的加载到系统中,不需要重新启动服务,只需要动态的注册就可以,这样日志服务就可以使用了。
这是一个使用osgi的开源系统
ToyBricks(积木)(以下简称ToyBricks)是基于面向积木方法论构建的、面向Java开发(尤其是RIA应用)的开源开发平台, 旨在提供给开发者一个简单易用、高效率、高产品质量、易扩展的开源平台,“像搭积木一样开发软件”。
详细介绍的地址:
http://www.iteye.com/news/23015
谁在用osgi
其实搞过开发的大概都知道,业界中鼎鼎大名的eclipse就是基于osgi来开发的。
并且很多大的应用厂商也在使用osgi进行模块化的开发。
包括spring、ibm的websphere和oracle的weblogic都已经宣布了支持osgi,这也同样可以看出,成为业界的标准可能就是下一步的问题。
osgi中的Bundle
bundle其中有包的意思,这个是osgi中比较核心的一个概念,也就是说我们控制osgi就是通过bundle来进行控制的。
bundle可以被动态的安装、启动、停止和卸载。并且Bundle也是服务和组件的载体。
看看Bundle Jar File的结构图:
Bundle的生命周期状态图:
Bundle状态解析:
Class Loading的概念图:
再看看服务注册
看看上边这个图是不是非常熟悉,典型的一个服务注册,发布,寻址的结构图,跟SOA的架构基本一致,也就是说osgi也是实现soa技术的方式之一。
通过上面的介绍,可以看出,其实Bundle就是我们手中的积木,通过osgi的框架把这些积木组织在一起,就形成了系统。
Bundle间的交互方式有两种:
1)通过package的Export和Import来进行。
2)另一种方式是通过Service的方式进行。
osgi中的service
定义了动态协作模型,该模型是一个发布、查找和绑定的模型。
Bundle可以注册服务、搜索服务、监听服务。通过BundleContext完成注册和获取服务,通过ServiceListener监听服务的状态。
OSGi 4推出了Declarative Services(DS) DS 提出了完整的 Service-Oriented Component Model (SOCM),面向服务的组件化模型—更好支持服务注册、获取、监听。
Component存在于Bundle中,可以相互调用。
osgi开发环境的搭建
选择eclipse3.1之后的版本的eclipse.
选择Run->Run Configuration
打开如下界面
在OSGI Framework上点击右键,新建,将显示所有的Bundles
取消所有Bundles的选择,只选择org.eclipse.osgi这个Bundle
运行,如果控制台中出现osgi>并且没有提示错误信息,说明配置成功。
然后输入ss,则可出现如下界面:
至此环境搭建完毕。
实例osgi
创建一个Plug-in project
然后点击下一步,输入工程名,要注意This plug-in is targeted to run with:这里选择的是standard
添入插件相关信息:
打开生成的Activator类,在start和stop方法中加入输出
public class Activator implements BundleActivator { private static BundleContext context; static BundleContext getContext() { return context; } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ public void start(BundleContext bundleContext) throws Exception { Activator.context = bundleContext; System.out.println( "hello OSGI started!" ); } /* * (non-Javadoc) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext bundleContext) throws Exception { Activator.context = null ; System.out.println( "hello OSGI stoped!" ); } } |
然后右键工程,选择Run Configuration,将Default Auto-Start设置为false
运行应用,分别输入start 1、ss、stop 1、ss
得到如下结果,则证明运行成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库