OSGi一小步–声明式服务

OSGi声明式服务是个好东西,有点依赖注入的味道,开发人员以配置的方式去注册或引用服务,你不需要为注册服务而单独写一个BundleActivator了,省去手工注册的繁琐。下面写一个例子改造上一篇代码的运行方式。

改造hello.service.consumer

去掉HelloServiceConsumer对BundleActivator的实现,变成一个非常普通的java类,部分代码如下:

//引用被注入的服务

private HelloService helloService;

//当组件变为satisfied时,该方法将被调用

public void activate(ComponentContext context) {

executor = Executors.newFixedThreadPool (1);

executor.execute(new HelloServiceVisitorTask());

System.out .println(“HelloServiceConsumer activate”);

}

//当组件变为unsatisfied时,该方法将被调用

public void deactivate(ComponentContext context) {

executor.shutdownNow(); //关闭服务访问线程

executor = null ;

System.out .println(“HelloServiceConsumer deactivate”);

}

//当SCR(Service Component Runtime)发现容器中注册有HelloService服务时,该方法将被

//调用,相当于注入helloService实例,该方法在组件激活前调用

public void setHelloService(HelloService helloService) {

System.out .println(“setHelloService”);

synchronized (helloServiceLock) {

if (this .helloService != helloService) {

this .helloService = helloService;

}}}

//当提供HelloService服务的组件变为不可用时,该方法将被调用,相当解绑引用

public void unsetHelloService(HelloService helloService) {

synchronized (helloServiceLock) {

if (this.helloService == helloService) {

this.helloService = null;

}}}

在src/main/resources目录下建立OSGi-INF目录,用来存放组件描述xml文件,内容如下:

<?xml version=”1.0″ encoding=”UTF-8″?>

<component name=”HelloServiceConsumerComponent”>

<!– 该组件没有提供服务 –>

<implementationMsoNormal” align=”left” style=”text-align:left;mso-layout-grid-align: none;text-autospace:none”>    <!–  引用服务  –>

<reference name=”HelloServiceComponent” interface=”org.lazyman.study.osgi.service.HelloService”

bind=”setHelloService” //绑定服务的方法

unbind=”unsetHelloService” //解绑服务的方法

//表示要求容器中存在HelloServiceComponent的个数,该参数影响组件的激活策略

cardinality=”0..1″

//在不调用deactivate情况重新绑定新的服务

policy=”dynamic” />

</component>

最后我们需要在MANIFEST.MF文件里增加新的头:

Service-Component: OSGi-INF/consumer.component.xml

改造hello.service.impl

去掉HelloServiceActivator类,增加hello.service.component.xml组件描述文件,内容如下

<?xml version=”1.0″ encoding=”UTF-8″?>

<component name=”HelloServiceComponent”>

<service>

// 表明提供org.lazyman.study.osgi.service.HelloService服务

<provide  interface=”org.lazyman.study.osgi.service.HelloService” />

</service>

// 服务实现类

<implementation />

</component>

同样需要在MANIFEST.MF文件里增加新的头:

Service-Component: OSGi-INF/hello.service.component.xml

部署运行

想激活基于服务的组件功能,需要增加如下bundle,可以去equinox网站下载

org.eclipse.equinox.ds    //提供SCR功能

org.eclipse.equinox.util  // ds的依赖

org.eclipse.osgi.services //osgi各种服务api

并且org.eclipse.equinox.ds bundle 必须在自定义bundle启动前启动,如下状态所示

Framework is launched.

id      State       Bundle

3       RESOLVED    hello.service.consumer_1.0.0

4       RESOLVED    hello.service.impl_1.0.0

5       RESOLVED    hello.service_1.0.0

6       RESOLVED    org.eclipse.equinox.ds_1.1.1.R35x_v20090806

7       <<LAZY>>    org.eclipse.equinox.util_1.0.100.v20090520-1800

8       RESOLVED    org.eclipse.osgi.services_3.2.0.v20090520-1800

启动 org.eclipse.equinox.ds bundle

start 6

id      State       Bundle

3       RESOLVED    hello.service.consumer_1.0.0

4       RESOLVED    hello.service.impl_1.0.0

5       RESOLVED    hello.service_1.0.0

6       ACTIVE      org.eclipse.equinox.ds_1.1.1.R35x_v20090806

7       ACTIVE      org.eclipse.equinox.util_1.0.100.v20090520-1800

8       RESOLVED    org.eclipse.osgi.services_3.2.0.v20090520-1800

分别启动5  4  3,可以看到如下结果

osgi> start 3

setHelloService //先调用服务绑定方法

HelloServiceConsumer activate //激活HelloServiceConsumerComponent

HelloService //调用服务接口方法的输出

该文总结了自己对OSGi声明式服务的学习历程,利用好这个功能可以让生活变得更加有趣!

目前启一个bundle都是手动start的,似乎有些麻烦,下篇将展示如何通过程序轻松启动所有bundle


–OSGi Declarative Services相关概念可以参见这篇文章(http://www.ibm.com/developerworks/cn/opensource/os-ecl-osgids/index.html )

osgiDeclarativeService:OSGI 声明式服务技术证明 osgi声明式服务 待办事项...在文件夹中结帐。 启动 eclipse Galileo 并将该文件夹用作工作区文件 > 将现有项目导入工作区。 应该有一个可以启动的 OSGI Run/Debug 配置。 待办事项更多信息... 立即下载

相关推荐

osgi实例(服务注册、引用、跟踪)

该资源里面包含了osgi服务的注册、引用、服务工厂、以及服务跟踪,都是非常简单的例子,但是却非常有代表性,特别适合对osgi框架有基础了解的开发人群

java组件中的热插拔(osgi)

 关键字: java 开发 osgi 组件 热插拔 大部分的开发这都是直接使用IDE,很少用人愿意去探究Eclipse内部的情况,而Eclipse本身就是有一大堆的Plug-in组成,同时提供一个OSGi的环境供众多的Plug-in使用。Eclipse与OSGI联姻的行为是从Eclipse 基金在Eclipse 3.0 发布的时候开始的,此后,Eclipse 逐步迁移到OSGi 框架中,并

光辉的技术收藏 9668

用pyqtgraph 和pyqt5绘制股票K线图

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'QWidget_plot.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost!...

qq_23114283的博客 5429

深入理解OSGI Equinox原理应用与最佳实践 知识整理篇

深入理解OSGI 知识整理

fenggfa的博客 1262

随机森林的可解释性分析(含python代码)

随机森林的“黑箱”特性逐渐凸显,这使得我们难以理解和解释模型内部的工作机制。对于许多应用场景而言,仅仅获得高准确率的预测结果是不够的;了解预测背后的逻辑同样重要,特别是在医疗诊断、金融风险评估等领域。因此,对随机森林进行可解释性分析变得尤为重要。

m0_59257547的博客 3848

深入RK3588内存管理:如何用dma_buf_alloc和mpp_buffer为RGA2分配4G以内内存(附kernel版本选择)

本文深入探讨了RK3588平台上RGA2核心的4G内存限制问题,详细解析了dma_buf_alloc和mpp_buffer两种内存分配方案的技术细节与适用场景。通过代码示例和性能对比,帮助开发者优化高分辨率视频处理流程,并提供了内核版本选择与常见错误排查指南。

weixin_29168153的博客 364

【OSGI】2.走近OSGI-开发第一个Plug-in项目

上一次我们介绍了什么是OSGI和OSGI在我们的项目中起到了什么作用。这次我们来亲手使用OSGI技术。 主要利用Eclipse开发工具提供给我们的plug-in插件工程模板来创建我们的工程。零距离的体验一下OSGI项目创建的基本过程,和运行流程以及其它相关的知识。 所有语言或技术的第一次测试通常都会以“HelloWorld”作为代表性语句,那么我们接下...

weixin_34150224的博客 565

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 4993

【OSGI】1.初识OSGI-到底什么是OSGI

目前,业内关于OSGI技术的学习资源或者技术文档还是很少的。我在某宝网搜索了一下“OSGI”的书籍,结果倒是有,但是种类少的可怜,而且几乎没有人购买。 因为工作的原因我需要学习OSGI,所以我不得不想尽办法来主动学习OSGI。我将用文字记录学习OSGI的整个过程,通过整理书籍和视频教程,来让我更加了解这门技术,同时也让需要学习这门技术的同志们有一个清晰...

weixin_33800463的博客 1249

Jetson工业级应用指南:用Orin NX 16GB打造多摄像头AI质检系统

本文详细介绍了如何利用NVIDIA Jetson Orin NX 16GB构建高效的多摄像头AI质检系统,涵盖硬件选型、软件优化及产线部署全流程。通过100 TOPS的AI算力和多路视频处理能力,Orin NX在工业4.0时代展现出卓越的实时缺陷检测性能,特别适合嵌入式AI应用场景。

Pepper的专栏 308

MCU工程迁移实战:从STM32到MSPM0L1306的完整指南

在嵌入式系统开发中,MCU工程迁移是开发者常面临的核心挑战,涉及从旧平台向新芯片的完整适配。其原理在于不同MCU在硬件架构、外设寄存器映射、时钟树及开发工具链上存在差异,迁移的本质是将应用逻辑与底层硬件实现解耦。这一过程的技术价值在于提升代码复用性、降低硬件切换成本,并确保产品能快速响应供应链或技术栈变化。典型应用场景包括产品升级换代、芯片缺货替代以及技术生态统一。本文以TI MSPM0L1306为例,详解如何通过对比清单分析、DriverLib API替换及分步调试,高效完成从STM32等平台到Arm C

weixin_27625589的博客 330

osgi一小步–开发流程与学习方法

学习OSGi有一段时间了,对OSGi项目的开发流程与学习方法做个小总结,也算是自己的学习心得吧,供自己日后学习与参考。 OSGi项目开发流程 工程建立方式 基于eclipse plugin的maven工程 这种工程被eclipse原生支持,可以通过eclipse向导页创建插件工程,通过mvn命令也可以为工程加入插件的nature,但生成后的工 程有可能需要手动处理依赖关系。公司里...

Mars Suburbs People 204

别再到处找离线包了!Visual Studio 2022 企业版/社区版离线安装保姆级教程(含工作负载选择指南)

本文提供Visual Studio 2022企业版/社区版离线安装的详细教程,包括工作负载选择指南和批量安装优化策略。针对网络隔离或带宽受限环境,介绍如何制作离线安装包、选择合适的工作负载组合,并分享高级技巧如增量更新和自动化部署,帮助团队高效统一开发环境配置。

weixin_28745821的博客 732

OSGI规范深入浅出

一、OSGI简介 1、OSGI简介 OSGI(Open Service Gateway Initiative),即开放服务网关协议,是面向Java的动态模型系统。 OSGI是指由OSGI Alliance组织制定的Java模块化规范,OSGI规范的核心部分是一个框架,其中定义了应用程序的生命周期模式和服务注册。基于OSGI框架定义了大量的OSGI服务:日志、配置管理,HTTP服务(运行Serv...

heyeqingquan的博客 2262

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式如何计算IC电源管脚电感操作指导

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式可以计算电容到IC电源管脚的电感,用于评估电容位置对于IC电源管脚的效果,如何分析,以下图为例进行说明。Capacitors:选择层面,这里选择top layer(IC在top层),下方可以选择电容的size,这里选择All Size。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。模式如何计算IC电源管脚电感操作指导。

weixin_54787054的博客 410

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

初探OSGi 之 DS 的运用

查了好些资料,从 2009 年的 opendoc 到 2012 年左右的一些零散例子,无非是用 felix 或者 eclipse 自带的插件环境来测试。于是想了想,不如就从 eclipse 入手吧。

u013948083的专栏 618

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【OSGI】5.实战OSGI-翻译助手项目03

我们上次开发了包含本地服务和远程服务两个插件的pulg-in项目,并且学习了如何注册和获取Service,如何绑定Http服务,如何绑定Servlet服务。 接下来我们依旧使用osgi技术,将项目改为使用Spring注入技术的项目。 说到这里不得不介绍一下Spring-DM: Spring-DM指的是 Spring Dynamic Modules。Sp...

weixin_33895604的博客 234

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OSGi实战 笔记

目标:弥补java模块化的不足 架构:框架(运行环境)+标准服务(常见任务) 一、OSGi框架:三层 模块层 生命周期层 服务层 创建应用程序方法: 设计:服务接口+客户端 实现服务提供者和客户端组件 服务提供者和客户端组件打包为独立的jar文件,加上OSGi元数据 启动OSGi框架 安装启动jar文件 模块层 OSGi模块指bundle(含元数据的jar文件) 用META-INF/MANIFEST.MF文件添加元数据信息,声明导入包、导出包 Bundle-Description: One-Ping-O

weixin_43941593的博客 1688

OSGI传统注册式服务与声明式服务

上一篇博文中我们编写了第二个简单的osgi的example,并编写了一个接口DictionaryService,并在Activator这个Bundle中实现了这个interface,并在start启动方法中进行了osgi服务的注册,但并没有使用这个服务,这一篇文章中并不讲解怎么使用这个已经注册的服务,但是会讲解服务的使用方式,一种为声明式服务,一种为传统注册式服务,以下就是开始讲解何为osgi的注册

u012734441的专栏 5573

基于OSGi的声明式服务

1. 引言   OSGi(Open Services Gateway Initiative)有双重定义。一方面它指OSGi Alliance组织;另一方面指该组织制定的一个基于Java语言的服务规范——OSGi服务平台。OSGi Alliance是一个由Sun Microsystems、IBM、爱立信等于1999年3月成立的开放的标准化组织。该组织及其标准原本目的在于使服务提供商通过住...

Mars Suburbs People 356

OSGi中获取Service的几种方式

在OSGi中,Service是动态管理的,OSGi容器提供的好几种获取和使用Service的方式,那么这几种方式各有什么优、缺点呢,下面我们就以org.osgi.service.log.LogService为例来分别讲一讲。 一。最原始的方式: &lt;!--&lt;br /&gt; &lt;br /&gt; Code highlighting produced by Actipro Co...

iteye_4350的博客 305

OSGI的基本概念[自己的理解]

    OSGI ,是一种规范,目前最新版本是R4版本,这个规范的目的是为了使java系统具有更好模块化,动态性,热插拔性能。    OSGI一个很重要的应用就是与Eclipse的结合,在Eclipse3.0之后,Eclipse的插件体系完全基于OSGI,所以在我们平时的应用中,完全可以感受到OSGI这种技术给我们带给的方便之处。    随着java系统对模块化,动态性需求的增加,OSGI的应用会越来广泛。    OSGI作为一种规范,目前实现OSGI这种规范的框架有很多种,比如Equinox,Felix,

stona126的专栏 3099

OSGI中的service依赖关系管理

    众所周知,对于高动态高可扩展的应用,OSGI是一个非常好的平台。但是,也因此增加了复杂性,开发中对service的依赖变得复杂。这也是service的关系管理成为OSGI中一个非常重要的部分,我们来看看OSGI中service依赖关系管理的方式。篇幅原因,只关注发展历程,不具体介绍每个方式的详细实现细节。     概括的说,目前在OSGI中主要有以下几种service依赖关系管理的方...

敖小剑的博客 290

再谈OSGi中的Service-Oriented Component Model

之前也写过关于Service-Oriented Component Model的blog了,Service-Oriented Component Model(以下简称SOCM)是OSGi R4中最为重要的改进,SOCM也是切实体现OSGi的动态性的模型,大家在使用SOCM的时候可能会因为受到原有思想的影响而一时无法理解,在这篇blog中将再次的对SOCM进行讲解,以便大家能够更好的理解和进行运用。...

BlueDavy 233

osgi 学习系列(四)osgi ds

1..1 情景: 1级的小小要释放技能,现在有2个技能可以选,Avalanche(V)和Toss(T),因为是1级的小小,所以只能选2个技能中的1个。 创建4个bundle com.ferry.ability.api 该bundle里只有一个技能接口 com.ferry.ability.avalanche 该bundle里只有一个实现接口的实现类Avalanche com.fer...

网站开发初中级代码参考-转载 306
上一篇: OSGi一小步
下一篇: OSGi一小步-快速启动Equinox
Snoopy7713
博客等级 码龄21年 17粉丝 681原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值