码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • OSGi 事件和服务调用(非SCR调用)


    网上对于 OSGi 的资料可谓不多,自从 SpringDM 停止维护后、国内的应用文章更加变少。

    今天写的是基于 eclipse 开发环境(equinox 核心)的、非 SCR 环境(即:不依赖注解的)的OSGi事件注册和服务调用。相比 Spring 框架的 “一体机” 打包策略,OSGi 保留了手动编写和定制系统的余地、且自带服务管理的功能。整个运行环境也很精简,基本类在 equinox.jar 里面。

    首先是我整理的 OSGi 组件的基本关系图。和手表 / 手机 / 其他机器的设计一样,都有一个核心(的逻辑)、包含一些基础的功能。在这个核心的基础上,我们扩展这些基础的功能、达到设计不同应用的目的。基本关系如下图所示。绿色虚线代表需要传入的参数 / 红虚线代表调用后获得的参数:

     【1】首先是 Bundle 的启停问题。以简单的流程讲,一个 Bundle 可以由某个 BundleActivator 调用。当 BundleActivator 激活时,系统将调用其 start 方法。当 BundleActivator 停止时(如:通过 gogo command 或者 equinox OSGi 命令行发送停止指令),系统将调用其 stop 方法。

    这两个方法都有一个 BundleContext 参数,代表当前的 Bundle。

    BundleActivator 激活,是依靠初次安装或通过 gogo command / equinox OSGi 命令行发送启动指令。BundleActivator 停止,是依靠 gogo command / equinox OSGi 命令行发送停止指令。

    【2】解决了 Bundle 的启停问题,我们可以开始调用服务了。服务的形式必须是一个接口定义方法、外加一个类来实现这个接口。

    编写了服务之后,我们需要先主动注册服务、(调用 BundleContext 或 Bundle 的 registerService() )才能进行调用。*当服务和 BundleActivator 是同一个类时,则不需要主动注册服务。

    当我们不再需要这个服务时,可以通过代码(BundleContext 或 Bundle 的 ungetService(),或者 ServiceRegistration 的 unregister())主动取消注册。

    【3】注册之后,想调用当前或其他 Bundle 包含的服务,需要用到 ServiceReference 对象。ServiceReference 对象是一个泛型、包装了【2】处编写的服务的接口。当我们注册之后,系统返回一个 ServiceRegistration 对象。调用返回的 ServiceRegistration 对象的 getReference() ,就可以获得 ServiceReference 对象。

    OSGi 在这一步提供了参数互换的办法:调用 BundleContext 的 getService() 方法获得【2】处编写的服务,需要传入 ServiceReference 对象作为参数。而调用  BundleContext 的 getServiceReference() 方法获得 ServiceReference 对象,需要传入 【2】处编写的服务的接口 作为参数。

    【4】重新获得【2】处编写的服务后,我们就可以按需调用服务中已有的方法 / 功能了。

    【5】在默认情况下,系统按照 注册(REGISTERED)-> 修改(MODIFIED)->修改至不符合监听条件(MODIFIED_ENDMATCH)-> 取消注册(UNREGISTERING) 的几个阶段运转这些 Bundle。如果我们要针对某个服务的某个阶段,增加一些额外的操作、可以在获得 ServiceReference 对象后,实例化一个 ServiceListener 对象;并重写该对象的 serviceChanged 方法。重写的作用是,视需要在全部阶段 / 某些阶段中,通过作为参数的 ServiceEvent 对象获得 ServiceReference、再通过 ServiceReference 获取服务接口做操作。

    先写到这里,有案例的再补充下。:)

    *参考资料:

    Knopflerfish OSGi, version 6.1.5 - OSGi Service TutorialThe OSGi Service Tutorialhttps://knopflerfish.org/releases/current/docs/osgi_service_tutorial.html

    OSGi Core Release 5https://docs.osgi.org/javadoc/r5/core/

    (完)

  • 相关阅读:
    直接插入排序,折半插入排序,冒泡排序,快速排序
    文献阅读-Robsut Wrod Reocginiton via Semi-Character Recurrent Neural Network
    戏说领域驱动设计(七)——限界上下文——延伸
    jsp设备信息查询系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
    一个数组的异或和是指数组中所有的数异或在一起的结果,给定一个数组arr,求最大子数组异或和。
    VirtualBox中安装MacOS Big Sur
    “闭关修炼”这么久,吃透这些“微服务”笔记,足够面试涨10K
    Java中方法的定义及注意事项
    R 语言详细安装教程(保姆级)及 RStudio简易安装教程
    python从入门到毕业,我用了两个月,你呢?
  • 原文地址:https://blog.csdn.net/u013948083/article/details/125911860
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号