每日一得--开发一个简单的 OSGi Web 应用实例

16、工业物联网架构开发与技术解析 本文详细解析了工业物联网(IIoT)的架构开发与相关技术应用。内容涵盖工业物联网基础与数据模拟、平台架构特性、微服务与容器技术、无服务器计算、标准数据流程、时间序列技术、资产注册表以及数据处理与分析平台。通过实践操作示例,如InfluxDB、Node-RED与OPC UA的结合,以及Docker Compose和Docker Build的使用,帮助读者构建完整的IIoT系统。文章最后总结了IIoT架构开发的关键技术,并展望了未来的发展趋势。 阅读详情

开发一个简单的 OSGi Web 应用实例

一个简单的 Web 应用

我们写一个简单的 Web 应用 compute.html :计算两个数字的和或乘积。如下图所示:

图 1. 一个简单例子
一个简单例子

为了体现 OSGi bundle 的动态部署能力,我们写两个 service bundle,其中一个计算两个数字的和(称为 add bundle),另外一个计算两个数字的积(称为 multiply bundle)。 当我们点击“Compute”按钮的时候,如果此时 add bundle 被部署,则页面将返回两个数字的和,否则如果此时 multiply bundle 被部署,则页面将返回两个数字的积。

开发环境准备

  1. 下载 Eclipse 3.4
  2. 获取所有 OSGi, Equinox 和 Spring 的插件, 如下图所示:
图 2. 相关插件列表
相关插件列表
  1. 打开 Eclipse, 设置 target platform 为上述插件集合

基本模块设计

该应用主要包含两个层次: 服务层和 Web 层。Web 层基于 Spring-MVC 实现,包含处理 Web访问相关的 bundle(本例中只有一个)。服务层包含处理数字计算的 bundle,本例中包含一个声明服务接口的 compute interface bundle 和两个实现该服务接口的 bundle :add bundle 和 multiply bundle。基本模块结构如下图所示:

图 3. 基本框架
基本框架

模块程序实现

Step 1 :实现 Service Layer

服务层的三个 OSGi bundle 实现完毕之后如下图所示 :

图 4. 服务层
服务层

服务层.bmp

其中 com.zxn.example.service.compute 是声明服务接口的 bundle。com.zxn.example.service.compute.add和com.zxn.example.service.compute.multiply 是实现了服务接口的两个 bundle。

  1. com.zxn.example.service.compute

声明一个 Compute 接口,其中包含一个接口方法 computeNums(),如下图所示 :

图 5. 服务层接口 bundle
服务层接口 bundle
  1. com.zxn.example.service.compute.add

bundle com.zxn.example.service.compute.add 的基本程序结构如下图所示:

图 6. 接口实现 bundle :add
接口实现 bundle :add

在该 add bundle 中,添加一个 Add 类,实现 Compute 接口,如下图所示:

图 7. 接口实现代码 :Add 类
接口实现代码 :Add 类

注意到我们在 META-INF 下建了一个 spring 目录,并且添加了一个 computeAdd-context.xml 文件。系统启动时,Spring 将利用该 xml 文件创建一个 bean 实例,并把该 bean 输出为一个 OSGi service,如下图所示 :

图 8. Spring 声明文件 :computeAdd-context.xml
Spring 声明文件 :computeAdd-context.xml

该xml文件中,osgi : service是 Spring-DM 输出 OSGi service 的标记,其中的 interface属性标明了该 service 实现的服务接口。

  1. com.zxn.example.service.compute.multiply

按照与 add bundle 同样的方法,实现 multiply bundle,如下图所示:

图 9. 接口实现代码:Multiply 类
接口实现代码:Multiply 类

接口实现代码-Multiply类.bmp

类似的,添加一个 computeMultiply-context.xml 输出 OSGi service,如下图所示 :

图 10. Spring 声明文件:computeMultiply-context.xml
Spring 声明文件:computeMultiply-context.xml

Step 2 :实现 Web Layer

Web 层只包含一个 bundle:com.zxn.example.web,采用 Spring-MVC 和 OSGi 构建,基本程序结构如下图所示:

图 11. Web Layer 程序结构
Web Layer 程序结构
  1. ComputeControler.java

该JAVA类实现了 org.springframework.web.servlet.mvc.Controller,是本 web应用中核心的 servlet,负责接受并处理 web 请求。该类调用 ComputeServiceRef 的方法实现业务逻辑。该类关键的方法是 handleRequest(…), 如下图所示 :

图 12. 核心 servlet 类
核心 servlet 类
  1. ComputeServiceRef.java

该 JAVA 类负责引用部署的 service bundle 完成最终计算,其中的 computeService 由 Spring 根据 OSGi 中实际部署的 service 进行注入。本例中,实际部署的 service 可能是 add bundle 或者 multiply bundle。

需要特别注意的是,此处体现了 Spring-DM 的动态特性。OSGi 的动态部署能力使得 Spring 的动态服务注入成为可能。

图 13. 服务消费类
服务消费类
  1. HTTPContextResgistry.java

该 JAVA 类负责在 OSGi 环境中配置和注册 HTTP 服务,其关键方法为 bean 初始化时调用的 init( ) 方法。

图 14. 在 OSGi 环境中注册 HTTP 服务
在 OSGi 环境中注册 HTTP 服务

该 init 方法中,第六行的 getHTTPService(…) 调用 OSGi 的 ServiceTracker 来获取 OSGi环境中注册的 HTTP 服务的引用,如下图所示:

图 15. 使用 ServiceTracker 获取 HTTP 服务
使用 ServiceTracker 获取 HTTP 服务
  1. computeWeb-context.xml

该 xml 文件主要用于配置 HTTPContextResgistry bean 类,以及导入对 Compute 服务接口的引用。标记 osgi : reference 用于声明要导入的服务接口,其 interface 属性标明了该接口的定义,本例中为 com.zxn.example.service.compute.Compute 接口。

图 16. Spring 声明文件:导入服务接口
Spring 声明文件:导入服务接口
  1. computeWeb-Dispatcher.xml

该 xml 文件用于配置 ComputeControler bean类。

图 17. Spring 声明文件:配置核心 servlet 类
Spring 声明文件:配置核心 servlet 类

运行程序

以往开发 J2EE 应用通常需要将应用服务器的 runtime 集成到开发环境中才能进行程序调试,非常麻烦。基于 OSGi 的应用完全可以脱离应用服务器运行,这使得程序开发和调试变得非常容易,直接在 Eclipse 中调试运行就可以。我们在 Eclipse 中将程序运行起来,如下图所示:

图18. 运行 OSGi 程序
图 18. 运行 OSGi 程序

从上图中看到,我们同时选择部署了 add bundle 和 multiply bundle,利用 OSGi console 察看如下:

图 19. 察看部署的 OSGi bundle
察看部署的 OSGi bundle

当 OSGi 环境中同时部署有多个服务接口的实现 bundle 时,OSGi 会选择一个默认的 bundle提供服务。本例中,Spring 会默认注入 add bundle。我们通过 web 访问 compute.html 页面:

图 20. 访问页面
访问页面

点 Compute 按钮之后,结果页面如下:

图 21. 访问结果
图 21. 访问结果

可以看出,是 add bundle 提供了计算服务。下面我们通过命令 <stop 76> 来停止 add bundle的服务:

图 22. 停止 add bundle
停止 add bundle
图 23. add bundle 状态变为 RESOLVED
add bundle 状态变为 RESOLVED

重新访问 compute.html 页面,结果得到的是两个数字的乘积。可以看出,是 multiply bundl

提供了计算服务。如下图所示:

图 24. 再次访问页面
图 24. 再次访问页面

小结

作为当前颇具生命力的两个标准和框架,OSGi 和 Spring 已经初步融合在一起。二者的结合,为开发企业级的 Web 应用同时提供了巨大的灵活性和动态部署能力。本文通过一个简单的例子,描述如何开发一个基于 OSGi 和 Spring 的 Web 应用,并说明了开发过程中涉及到的技术关键点。

Spring与OSGi集成深度解析:多层次整合技术要点 OSGi(Open Service Gateway Initiative)是一个基于Java语言的服务(模块)化规范。随着软件系统复杂性的增加,OSGi应运而生,旨在提供一种轻量级、高度模块化的系统架构。编程式集成指的是开发者通过编写代码的方式来集成不同系统或模块。与基于配置的集成相比,编程式集成提供了更高的灵活性和控制能力,但同时也要求开发者需要有更深入的技术理解。编程式集成的核心特点包括:直接性:通过直接编写代码来调用接口或实现逻辑,不需要额外的配置文件或工具。动态性。 阅读详情

相关推荐

spring-osgi 入门手册和代码

spring-osgi 入门手册和代码 spring-osgi 入门手册和代码 spring-osgi 入门手册和代码 spring-osgi 入门手册和代码

OSGI和Spring动态模块–简单的Hello World

在此姿势中,我们将采用使用OSGi进行的第一个实现,并使用Spring Dynamic Modules改进应用程序。 Spring动态模块(Spring Dm)使基于OSGi的应用程序的开发更加容易。 这样,服务的部署就容易得多。 您可以像其他任何Spring bean一样注入服务。 因此,让我们从Spring dm开始。 首先,您需要下载Spring Dm Distributio...

最佳 Java 编程 1097

spring-boot-with-embeded-osgi:带有嵌入式OSGI框架的Spring Boot项目

带有嵌入式OSGI的Spring Boot 这是一个嵌入了Felix OSGI框架的示例Spring Boot项目。 其他项目是API(接口和模型类)及其实现。 Spring Boot应用程序将这些程序包作为OSGI框架的额外程序包公开(以便能够使用公开的服务)。 有关请参见stackoverflow的帖子。 嵌入式OSGI中的日志记录解决方案 添加了描述的日志记录解决方案。

基于 OSGi的企业级开发框架实践——认识OSGi和SpringDM

一. OSGi基础 1. 什么是OSGi OSGi——Open Service Gateway Initiative,最初的目的是为各种嵌入式设备提供通用的软件运行平台。后来经过10年的发展和壮大,OSGi已经不只是在嵌入式设备中应用,而是被推广到各种其他的应用领域,比如其中最成功的Eclipse IDE。目前在企业级应用开发中也开始大量使用OSGi技术,尤其是在应用服务器领域,各大主要厂商相...

贫僧法号梦遗 1376

Windows下Colmap编译安装全攻略:从Boost到CUDA的避坑指南

本文详细介绍了在Windows系统下编译安装Colmap三维重建工具的完整流程与实战经验。针对Boost库版本兼容性、CUDA与Visual Studio的版本匹配等常见难题提供了具体的避坑指南和解决方案,帮助开发者高效完成从环境配置到最终部署的全过程。

weixin_28235513的博客 199

miRNA测序数据生信分析——第一讲,总结概述

这里的miRNA测序指转录水平的测序。这里每一个数据库都可以在线访问,但是如果要本地使用,都需要进行数据库文件下载,整理。

weixin_44616693的博客 4953

OSGI企业应用开发(十二)OSGI Web应用开发(一)

前面文章中介绍了如何在OSGI应用中整合Spring和Mybatis框架,本篇文章开始介绍如何使用OSGI技术开发Web应用。对于传统的Java EE应用,应用中涉及到的Web元素无非就是Servlet、JSP、静态资源等,其中静态资源包括HTML页面、CSS、图片等等。当然还有Portlet、Filter、Listener等,由于不太常用,本文就不涉及这方面的内容了。 ...

weixin_33755847的博客 288

CVPR 2024 LaTeX 模板实战:从匿名提交到图表排版的避坑指南

本文详细解析CVPR 2024 LaTeX模板的使用技巧,涵盖匿名提交设置、pdfLaTeX编译器选择、图表排版优化等关键环节。通过实战案例演示智能引用、公式编号、三线表制作等专业技巧,帮助研究者高效完成论文格式规范,规避常见排版错误。特别针对双栏格式下的图片定位、跨栏表格等复杂场景提供解决方案。

weixin_42561040的博客 453

Spring与OSGi的整合(二)

上接Spring与OSGi的整合(一)   3. 开发一组计算器bundle实例   本节讲到的例子是仿照网上甚为流行的一个例子,但苦于一直未找到源码,网上贴的都是一些转帖,代码片段,估计初学者很难将其还原并调通!我最开始弄这个咚咚的时候,其过程之痛苦,难以言喻,所以想着仿照该例子的设计,给予实现,文后贴出源码,希望能帮到大家。该例子是一个关于计算器的实例,osgi.example.com...

梦幻爪哇国 805

全网最详细 解决戴维南定理的详细推导

替代定理,戴维南定理详细证明

m0_52555753的博客 3万+

WhatsApp协议算法

我想其实有很多人还不太了WhatsApp群控,简单来说,它和我们常使用的微信聊天软件是类似的,只不过它是基于通讯录的,操作起来比较简单便捷,所以现在有很多国家都喜欢用WhatsApp。一般情况下,筛号不会造成账号被封的情况,但是呢,如果筛号的频率太快,就会被系统限制筛号能力,不再返回筛号结果,所以,筛号数量和速度一定要控制好。前天逛街突然灵光一现,为什么不试试多路访问呢,简单来说就是信道复用技术,马上跑回家,调取接口,接入通道,导入已经转换成协议的账号,成功登录!

2403_87755661的博客 1943

每日一得--实例讲解OSGI开发

OSGI(Open Services Gateway Initiative),或者通俗点说JAVA动态模块系统,定义了一套模块应用开发的框架。OSGI容器实现方案如Knopflerfish, Equinox, and Apache Felix允许你把你的应用分成多个功能模块,这样通过依赖管理这些功能会更加方便。 和Servlet和EJB规范类似,OSGI规范包含两大块:一个OSGI容器需要实

xoopx的专栏 446

OpenClaw进阶实战(二十三):微信公众号接入——被动回复、客服消息、素材管理

本文介绍了将OpenClaw接入微信公众号的完整方案,重点包含以下内容: 接入方案选型:对比官方插件、三方服务和自建中转三种方式,选择自建Node.js中转服务实现灵活控制 核心原理:通过中转服务器完成微信消息协议转换,处理5秒超时限制和异步回复机制 实战开发: 搭建Express中转服务 实现Token管理和消息处理 采用内存缓存对话历史 通过客服接口异步回复 官方插件方案:介绍2026年发布的ClawBot插件,支持文本/图片/文件收发 进阶功能:包括素材管理接口调用示例 该方案适用于需要深度定制公众号

PeterPan的博客 142

高级java每日一道面试题-2025年6月19日-基础篇[JCache(JSR-107)]-讨论使用 JCache 时可能遇到的 类加载器(ClassLoader)问题,尤其是在 OSGi 或复杂的企

JCache类加载器问题及解决方案 在OSGi和企业级应用中使用JCache时,类加载器隔离会导致严重问题: 类型转换异常:相同类被不同ClassLoader加载会导致ClassCastException 类查找失败:模块间类不可见引发ClassNotFoundException 序列化问题:跨模块数据反序列化失败 典型场景: OSGi环境中各Bundle有独立ClassLoader 应用服务器中WAR包使用隔离ClassLoader JCache API/SPI实现与应用程序ClassLoader不匹配

qq_43071699的博客 63

ASProxy64.dll导致jetbrains家的IDE都无法打开。

摘要:在Windows11系统中,JetBrains IDE无法启动,报错指向ASProxy64.dll文件。该第三方DLL被注入到JVM原生层,导致内存访问冲突(错误代码0xc0000005)。经排查发现此文件来自Astrill软件。解决方案为卸载Astrill后重启电脑,问题得以解决。该案例表明第三方DLL注入可能影响IDE正常运行,卸载相关软件是最直接的解决方法。(149字)

猿小白的博客 937

AIGC时代的必备技能:提示词工程(Prompt Engineering)全面指南

本文主要介绍了AIGC时代的重要技能——提示词工程(Prompt Engineering)。文章首先定义了提示词的概念,强调其作为人类与AI沟通桥梁的重要性,并详细阐述了提示词的功能特性,包括输入、大模型处理和输出三个环节。接着,文章探讨了提示工程的重要性,如提高输出质量、节省资源和时间等。随后,文章深入分析了提示词的基本构成要素,包括指令、上下文、输入数据和输出指示符,并提出了提示词的五大基本原则:清晰性与具体性、提供充足的上下文、明确任务与目标、考虑受众和迭代思维。最后,文章介绍了提示词的七大常见技巧

weixin_43178406的博客 27万+

每日 Java 面试题分享【第 18 天】

1. 直接回答技术点(考察基础理解)双亲委派模型(Parent Delegation Model)向上委派:当一个类加载器收到类加载请求时,先不自己加载,而是递归地将请求委派给父类加载器处理。向下传递:只有父类加载器无法加载(搜索范围内找不到该类)时,子类加载器才会尝试自己加载。目标保证类的唯一性和安全性,避免重复加载核心类(如)或恶意替换核心类。2. 底层原理深入(考察源码和机制)核心源码逻辑(以为例)// 1. 检查是否已加载过该类Class<?try {

2302_81141145的博客 981

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【实战JVM】打破双亲委派机制之自定义类加载器

一个Tomcat程序中是可以运行多个Web应用的,如果这两个应用中出现了相同限定名的类,比如Servlet类,Tomcat要保证这两个类都能加载并且它们应该是不同的类。如果不打破双亲委派机制,当应用类加载器加载Web应用1中的MyServlet之后,Web应用2中相同限定名的MyServlet类就无法被加载了。Tomcat使用了自定义类加载器来实现应用之间类的隔离。每一个应用会有一个独立的类加载器加载对应的类。那么自定义加载器是如何能做到的呢?

鱼干的博客 2068

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OpenDaylight实战手记(二)OpenDaylight编译、安装、运行

1、 下载源代码 打开 https://jenkins.opendaylight.org/controller/job/controller-daily/ws/opendaylight/,在页面下方点击“打包下载全部文件”。然后解压,解压后的目录尽量保证全部为英文字符。 2、 安装 打开控制台窗口,进入解压后目录 controller\opendaylight\distributi

优快云:ICTCamera,新浪微博:ITCamera。 6475

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IntelliJ IDEA History

为什么80%的码农都做不了架构师?>>> ...

weixin_34418883的博客 492

高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?

在Java高级面试中,类加载器(ClassLoader)是一个重要的概念,它涉及到Java类的加载和初始化机制。类加载器是Java虚拟机(JVM)提供的一种机制,用于将Java类的字节码(.class文件)从文件系统、网络或其他来源加载到内存中,并生成对应的Java类对象。它是Java程序运行时环境的一部分,负责动态加载和链接Java类。类加载器是Java平台的一个重要组成部分,它不仅控制着类的加载过程,还影响着应用程序的安全性和灵活性。

qq_43071699的博客 1004

栋的周评 | 第十四回合(定期更新、动态、架构、云技术、算法、后端、前端、收听/收看、英文、书籍、影视、好歌、新奇)

开篇词 大家好!以下是我在 2020 年 3 月 30 日至 4 月 5 日的所见、所闻、所学和所悟。 现在,我把它们安利给你们。   已完结 Linux 管理员手册:既简单又深刻 Spring 官方指南   定期更新 原创专栏: 栋的周评 一文搞定 官方授权: Baeldung Java 周评 符合官方许可: Spring 主题相关指南   ...

纽雪澳诺加海美德的博客 819

DBeaver:5 万星的免费数据库管理工具

DBeaver是一款开源的跨平台数据库管理工具,在GitHub上获得5万+星标。它支持100多种数据库驱动,兼容JDBC/ODBC驱动,适用于开发者、DBA和数据分析师。核心功能包括Schema/SQL/数据编辑器、AI集成、ER图、数据迁移等,支持80+关系型数据库和大数据平台。专业版还支持NoSQL和平面文件查询。DBeaver基于Java开发,采用Eclipse RCP框架和模块化设计,同时提供网页版CloudBeaver。项目遵循Apache 2.0协议,持续更新并欢迎社区贡献。该工具降低了多数据库

yanyubits291的博客 316

JFox3.0 【Java开源应用服务器】

JFox 是 Open Source Java EE Application Server,致力于提供轻量级的Java EE应用服务器,从3.0开始,JFox提供了一个支持模块化的MVC框架,以简化EJB以及Web应用的开发! 如果您正在寻找一个简单、轻量、高效、完善的Java EE开发平台,那么JFox正是您需要的。 JFox 3.0 拥有以下特性: 1. 重新设...

weixin_34407348的博客 299

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

OpenEMS开源能源管理系统:从入门到精通的智能能源管理指南

想要轻松管理太阳能、储能电池和电动汽车充电桩吗?OpenEMS开源能源管理系统正是您需要的智能能源管家!无论您是家庭用户希望优化用电成本,还是企业需要管理复杂的能源网络,OpenEMS都能为您提供专业级的能源管理解决方案。这个完全开源免费的平台,基于AGPL-3.0和EPL-2.0协议,让您能够自由使用、修改和分发,真正实现能源管理的自主可控。 ## 🎯 为什么选择OpenEMS开源能源管理系

gitblog_00849的博客 508
上一篇: 每日一得--Spring Web Flow 2.0 入门
下一篇: 每日一得--HTTP请求常见的返回状态码
一根筋i
博客等级 码龄16年 7粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值