OSGi服务发布与引用工具-SAT

OSGi的服务层(Service Layer)为bundle之间的解耦合及服务引用提供的强大而又灵活的实现机制。通过BundleActivator控制组件的生命周期,通过BundleContext与其他组件和服务交互。但是,OSGi服务层在提供强大的功能的同时,也给使用者造成了很大的困惑,比如,组件的启动顺序,服务的查找策略等等。OSGi通过Declarative Service给出了一种通过XML配置文件发布和绑定服务的功能,用户只需要定义XML文件即可向OSGi环境中发布服务对象和获取其他bundle组件发布的服务。

在OSGi编程过程中,获取其他Bundle提供的服务是比较复杂的,尤其是获取多个服务时需要做很多重复性的工作。有没有更为简单的方式实现服务的发布和绑定呢?最近在Equinox邮件列表中看到Patrick的向equinox开发组的一项提议,建议将Service Activator Toolkit(SAT)组件添加到Equinox项目中,SAT目前位于Eclipse 技术项目OHF中。

SAT大大简化了OSGi Service Bundle开发的复杂性。用户可以通过SAT插件引用服务,发布服务,自定义Bundle Activator。下面是SAT插件的功能略图:

上图展示了如何引用和发布服务

上图展示了如何定制BundleActivator。

下面通过几行简单的代码展示SAT如何简化服务的发布和引用。

//服务的发布

public class Activator extends BaseBundleActivator {
protected void activate() {
LogUtility.logInfo("The Hotdog Vendor bundle has been activated"); //$NON-NLS-1$
addExportedVendorService();
}

//将HotdogVendor服务发布到OSGi环境中

private void addExportedVendorService() {
VendorService service = new HotdogVendor();
Dictionary properties = new Hashtable(11);
properties.put(VendorService.SPICINESS_PROPERTY, new Integer(10));
addExportedService(VendorService.SERVICE_NAME, service, properties);
}

protected void deactivate() {
LogUtility.logInfo("The Hotdog Vendor bundle has been deactivated"); //$NON-NLS-1$
}
}

//服务的引用

public class Activator extends BaseBundleActivator {
private Customer customer;

//组件启动激活

protected void activate() {
LogUtility.logInfo("The Customer bundle has been activated"); //$NON-NLS-1$
VendorService vendor = getVendorService();
Customer customer = getCustomer();
customer.setVendor(vendor);
customer.eat();
}

//组件停止注销

protected void deactivate() {
Customer customer = getCustomer();
customer.setVendor(null);
LogUtility.logInfo("The Customer bundle has been deactivated"); //$NON-NLS-1$
}

private Customer getCustomer() {
return customer;
}

//声明需要引用的服务的名称

protected String[] getImportedServiceNames() {
return new String[] {
VendorService.SERVICE_NAME
};
}

//设定服务过滤条件

private String getVendorFilter() {
StringBuffer buffer = new StringBuffer(50);
buffer.append('(');
buffer.append(VendorService.SPICINESS_PROPERTY);
buffer.append("<="); //$NON-NLS-1$
buffer.append(8);
buffer.append(')');
String filter = buffer.toString();
return filter;
}

//获取HotdogVender服务

private VendorService getVendorService() {
return (VendorService) getImportedService(VendorService.SERVICE_NAME);
}

private void setCustomer(Customer customer) {
this.customer = customer;
}

protected void start() throws Exception {
LogUtility.logInfo("The Customer bundle has been started"); //$NON-NLS-1$
Customer customer = new Customer();
setCustomer(customer);
String filter = getVendorFilter();
addImportedServiceFilter(VendorService.SERVICE_NAME, filter);
}

protected void stop() throws Exception {
setCustomer(null);
LogUtility.logInfo("The Customer bundle has been stopped"); //$NON-NLS-1$
}
}

SAT目前从Eclipse CVS上可以获取到。CVS的访问地址为:

:pserver:dev.eclipse.org:/cvsroot/technology org.eclipse.ohf/plugins/org.eclipse.soda.sat
SAT-crx插件 语言:English (United States) sat 1键单击登录 SAT Mobile ID为分钟内提供2系列的身份验证。 目前与Google Docs,Office 365,Amazon,OKTA,Salesforce合作...... SAT Mobile ID使您可以使用点击智能手机登录网站。 只需从iTunes或Google Play下载SAT Mobile ID,并申请帐户。 立即下载

相关推荐

PCB过孔全介绍

过孔(via)是多层PCB的重要组成部分之一,钻孔的费用通常占PCB制板费用的30%到40%。简单的说来,PCB上的每一个孔都可以称之为过孔。从作用上看,过孔可以分成两类:一是用作各层间的电气连接;二是用作器件的固定或定位。如果从工艺制程上来说,这些过孔一般又分为三类,即盲孔(blind via)、埋孔(buried via)和通孔(through via)。盲孔位于印刷线路板的顶层和底层表面,具

小王的自我修行路 2354

CocosCreator打包字节小游戏插件脚本SAT.js没有被导入

1、打包字节小游戏出现问题项目使用了第三方插件脚本SAT.js,打包H5没有问题,可以正常运行,打包字节小游戏会出现没有导入进来找不到的情况。打包之后运行出现的问题:2、解决办法在打包完成的项目下找到game.js文件。

lao_wang_的博客 306

open-web UI 实用指南

open-web UI 类似于chatgpt的界面,可以私有化模型本地部署,也可以用商业模型.本文只是用开源模型. 它以实现多模态AI聊天 , AI 翻译 , 语音转文本, 文本转语音, 文生图,代码助手,可谓利器。

szmars的博客 3万+

基于插件化(OSGI)的开源快速开发平台——JXADF

JXADF是一个基于OSGi的企业级快速开发平台(已开源),他适合做各种信息管理系统。更多详情,参见:http://osgi.jxtech.net也可直接加QQ群:429895245 转载于:https://blog.51cto.com/wmzsoft/1678898...

weixin_33676492的博客 219

海康威视HiTools实战:5分钟搞定工业镜头选型(附避坑指南)

本文详细解析了海康威视HiTools在工业镜头选型中的应用,通过五步操作流程帮助用户快速匹配适合的镜头型号。文章深入探讨了工业视觉系统的核心参数,包括焦距、视野、景深和畸变控制,并提供了光源搭配和系统集成的实战指南,助力提升机器视觉检测精度与效率。

u0v1w2x3的博客 1056

告别绕线!用Altium Designer从零设计一个PCB平面变压器(附3D模型)

本文详细介绍了如何使用Altium Designer从零设计一个PCB平面变压器,包括磁芯选型、电气参数计算、PCB设计实战技巧以及3D验证与生产输出。通过将绕组直接集成到PCB层中,配合嵌入式磁芯,实现了小型化、高功率密度的电源设计,适用于中低电流、高频应用场景。附3D模型,帮助读者快速掌握这一创新设计流程。

weixin_33716154的博客 441

SAT插件引用服务、发布osgi服务

OSGi的服务层(Service Layer)为bundle之间的解耦合及服务引用提供的强大而又灵活的实现机制。通过BundleActivator控制组件的生命周期,通过BundleContext与其他组件和服务交互。但是,OSGi服务层在提供强大的功能的同时,也给使用者造成了很大的困惑,比如,组件的启动顺序,服务的查找策略等等。OSGi通过Declarative Service给出了一种通过XM...

轻轻草原 239

Open3D——直通滤波(python详细过程版)【2025最新版】

python就一个字:强。博客长期更新,本文最近更新时间为:2025年1月11日。

点云侠的博客 7514

OSGi规范与原理(1)

一、OSGi基本概念1. Bundle Bundle是OSGi中的模块,其生命周期被OSGi所管理,可以被动态的安装、启动、停止和卸载。通过OSGi框架将多个Bundle组织在一起就形成了系统。每一个Bundle有独立于其他Bundle的ClassLoader,所以每个Bundle的内部实现都是隔离的。 2. Service OSGi服务就是注册到OSGi框架当中的Java对象。在注册时可以

CanftIn's blog 1002

Spring AI提示词模板应用

本文介绍了使用SpringAI提示词模板的配置方法,主要步骤包括:1)在JDK17和SpringBoot3.4.4环境下引入spring-ai-alibaba1.0.0.2依赖;2)配置application.yml文件;3)创建测试控制器类处理提示词模板(.st文件);4)通过模板变量动态生成AI回复内容。演示了如何通过@RequestParam设置默认参数,实现无需前端传参即可测试AI回复功能,最终完成了一个SpringAI提示词模板的应用Demo。

wjianwei666的专栏 196

Vue3 - Element Plus 下拉选择器 el-select 覆盖修改 placeholder样式,解决覆盖不生效问题(支持修改文字颜色、文字大小、选择器边框、hover效果、宽高等任意样式

vue3,element-plus,el-select,下拉选择器,下拉选择框,Select选择器,deep覆盖无效怎么办,怎么修改placeholder文字颜色,选择器select修改边框样式,修改文字大小,elementPlus选择器如何覆盖hover效果,使用deep改不了样式,修改边框颜色,select去掉边框,vue3+elementPlus中select选择器如何修改placeholder文字样式,修改el-select样式,select选择器样式覆盖不了咋办,el-select如何覆盖原样式,

🏆 前端领域优质创作者 1万+

Maven 4核心变革与迁移指南

构建工具是软件开发中的基础设施,Maven作为Java生态中最主流的依赖管理和项目构建工具,其核心原理是基于POM(Project Object Model)模型进行依赖解析和生命周期管理。随着项目规模扩大,Maven 3.x在性能和多模块项目管理上逐渐显现瓶颈。Maven 4通过重构依赖解析引擎、引入增量编译缓存和并行构建机制,显著提升了构建效率。在企业级应用中,这些改进尤其适合微服务架构和持续集成场景。新版对POM模型的现代化改造支持YAML/JSON格式,同时保持对XML的兼容,解决了配置灵活性问题。

weixin_30387423的博客 424

【以太网硬件六】1000base-T物理层编码究竟是怎么编的?

详述1000base-T物理层4D-PAM5的编码过程

highman110的博客 5323

Eclipse Ganymede:深入Equinox p2(供应平台)

http://www.infoq.com/cn/news/2008/06/eclipse-ganymede-p2 P id=rf-f5>作为预定6月25日发布的Eclipse Ganymede的一部分,Infoq将推出一系列Eclipse子项目的相关报道。今天,我们将探讨的子项目是Equinox p2(供应平台),它是供应基于Eclipse应用的框架。Infoq采访了 Jeff

Jackia的专栏 682

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OSGI:服务的发布和引用

一、在Activator中注册和引用服务 该方式可以说是最原始的方法,首先在MANIFEST.MF中配置需要导入的服务接口MyService(Import-Package: org.jack.MyService),然后采用硬编码方式注册服务: public class MyActivator implements BundleActivator { private ServiceRe...

小白编程 363

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OSGi bundle之间互相通信的方法

摘要 OSGi的一个标准就是各个bundle之间是相互隔离的,每个bundle都有自己的classloader,并且不同的版本之间都是相互隔离的,这样就使bundle从物理上进行了隔离,那么OSGi 的bundle之间是怎么进行通信的呢? 下面我们将要介绍3中方法。 Bundles之间通信的方法 方法 描述 ...

578

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

osgi中的bundle之间互相服务

在osgi系统中,服务是不能孤立存在的,每个服务都从属并运行在提供服务的bundle上。bundle要提供服务供其他模块使用,首先要把服务注册到一个由OSGI框架提供、被所有bundle共享的服务注册表(service registry)中,其他bundle使用服务时只需从注册表中查找所需的服务而不与提供服务的bundle直接交互,因此不需要关注该服务来源于哪个bundle,更不需要导入提供服务的

MennyFei 1608

OSGI服务发布与引用

OSGI context提供service register方法负责osgi服务的注册发布,服务发布时,可带上服务属性,这些服务属性可用于服务引用方查找服务时的filter。 一般来说,没有依赖的简单服务,可以直接在bundle的activator start方法里注册发布,但通常情况下,服务都会存在或多或少的依赖,由于osgi平台的动态性,被依赖的服务并不能确定在依赖它的服务所...

phomkueng的专栏 248

OSGi 插件管理

文章: http://www.360doc.com/content/12/0322/18/9210133_196714278.shtml 文章: http://www.360doc.com/content/12/0322/18/9210133_196714278.shtml 基于OSGi 插件框架的试验数据管理系统的实现 基于框架插件的软件配置管理的研究和实现 OSGI实战 4大 J

guang11cheng的专栏 969

pip全局安装位置

还有一个 Scripts 目录,里面有一个 python.exe 文件,在这个虚拟环境的项目中就是用这个 python.exe 来运行 python 代码的。在写 python 的时候,我使用的编译器是 jetbrains 的 pycharm,每次创建项目的时候,默认是创建虚拟环境项目。不过比较占用空间,如果 A 和 B 都要用同一个依赖,是不能只保存一份依赖,两个项目复用的,必须在两个项目里面都复制一份。比如,在 pycharm 中安装依赖,这个依赖是保存在当前项目的 Lib 目录下的。

2303_76661774的博客 58

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 401

Jupyter Notebook 安装包下载|单元格分块运行,图表直接内嵌

本文详细介绍Jupyter Notebook的安装与基础使用,推荐通过Anaconda一键安装,省去配置烦恼。文中涵盖Jupyter Notebook的交互式特性、单元格操作、Markdown与代码混合编写、第三方库安装及常用快捷键,帮助新手快速上手,高效完成数据分析、教学演示等任务。

GDShrc的博客 192

从0到打通CICD!SpringBoot+GitLab+Jenkins+Docker完整实验

开源Java编写CI/CD工具;依靠插件扩展能力。核心概念:Job任务、Pipeline流水线、Agent执行节点、Artifact构建产物、Plugin插件。Pipeline阶段:拉取代码 → 编译构建 → 单元测试 → 代码质量扫描 → 打包制品 → 部署测试环境 → 部署生产。IDEA提交代码不要提交.idea目录,会产生冲突。Docker daemon.json不能存在非法url,否则docker启动失败。

2403_87659444的博客 196

学习FreeRTOS推荐哪本书?

第3部分结合硬件实战,讲解基于FreeRTOS开发UART、USB等外设驱动的方法,演示任务、中断、DMA的协同使用,并讲解松耦合架构设计;《FreeRTOS实战:用STM32+SEGGER打造工业级实时嵌入式系统(第2版)》内容由浅入深、理论结合实战,既适合嵌入式系统入门者从零学习RTOS与FreeRTOS开发,也可供具备一定经验的嵌入式工程师参考,用于提升FreeRTOS项目开发、驱动设计与系统调试能力。第14~15章介绍FreeRTOS的内存管理,以及FreeRTOS在多处理器与多核系统中的应用。

人邮异步社区 270

OpenCV学习(一)

本文介绍了OpenCV的基本概念与应用,通过简单代码演示图像灰度转换与人脸检测,展现其“简化复杂视觉任务”的核心优势。OpenCV是开源、跨平台、多语言支持的计算机视觉库,广泛应用于人脸识别、车牌识别、工业检测等领域。文章详细指导了在Windows系统下使用Python 3.12搭建OpenCV开发环境的步骤,包括Python安装、环境变量配置及验证方法,为初学者提供清晰的入门路径。

xiao_suan_cai的博客 170
上一篇: OSGi服务发布与引用工具-SAT
下一篇: Castor功能与应用参考(五)- JDO映射定义
chrisrc
博客等级 码龄20年 8粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值