服务osgi

在本文中,我们将使用OSGi开发一个简单的Hello World应用程序。 我们将使用Felix作为OSGi容器 。 在下一篇文章中,我们将继续使用该应用程序,并使用Spring Dynamic Modules对其进行改进。

为了使开发有趣,我们将创建两个捆绑包:

  • 提供HelloWorld服务的捆绑包
  • 消耗该服务以定期间隔打个招呼的捆绑软件。

因此,让我们从第一个捆绑包开始。 我们首先需要的是一个非常简单的服务,在控制台中提供简单的打印:

package com.bw.osgi.provider.able;public interface HelloWorldService {void hello();
}
package com.bw.osgi.provider.impl;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldServiceImpl implements HelloWorldService {@Overridepublic void hello(){System.out.println("Hello World !");}
}

我们再简单不过了。 然后,我们需要使用激活器导出服务:

package com.bw.osgi.provider;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;import com.bw.osgi.provider.able.HelloWorldService;
import com.bw.osgi.provider.impl.HelloWorldServiceImpl;public class ProviderActivator implements BundleActivator {private ServiceRegistration registration;@Overridepublic void start(BundleContext bundleContext) throws Exception {registration = bundleContext.registerService(HelloWorldService.class.getName(),new HelloWorldServiceImpl(),null);}@Overridepublic void stop(BundleContext bundleContext) throws Exception {registration.unregister();}
}

这里有很多代码。 对于那些对OSGi不确定的人,可以做一些解释。 当模块启动时将调用start方法,而在模块停止时将调用stop方法。 在start方法中,我们使用接口名称作为导出服务的名称在包上下文中注册我们的服务。 第三个参数null表示我们不为此服务提供任何配置。 在stop方法中,我们只是取消注册服务。

现在,我们的第一个捆绑包已准备就绪。 我们可以建立它。 为此,我们将使用Maven和maven-bundle-plugin直接构建OSGi Bundle。 这是项目的pom.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>OSGiDmHelloWorldProvider</groupId><artifactId>OSGiDmHelloWorldProvider</artifactId><version>1.0</version><dependencies><dependency><groupId>org.apache.felix</groupId><artifactId>org.osgi.core</artifactId><version>1.4.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>OSGiDmHelloWorldProvider</Bundle-SymbolicName><Export-Package>com.bw.osgi.provider.able</Export-Package><Bundle-Activator>com.bw.osgi.provider.ProviderActivator</Bundle-Activator><Bundle-Vendor>Baptiste Wicht</Bundle-Vendor></instructions></configuration></plugin></plugins></build>
</project>

然后,使用mvn install进行构建。

我们将在一个名为osgi的文件夹中工作,因此我们会将这个新捆绑包复制到osgi文件夹中。

我们已经可以在OSGi容器中对其进行测试。 如果您还没有Felix,请在这里下载。 您必须选择“ Felix分布”。

然后将其解压缩到我们之前创建的osgi文件夹中。 现在,您必须具有以下文件夹结构:

osgi- felix- OSGiDmHelloWorldProvider-1.0.jar

这样我们就可以进入felix文件夹并启动Felix:

wichtounet@Linux-Desktop:~/Desktop/osgi/felix$ java -jar bin/felix.jar
_______________
Welcome to Apache Felix Gogog!

并安装我们的捆绑包:

g! install file:../OSGiDmHelloWorldProvider-1.0.jar
Bundle ID: 5

该安装已正确安装,我们可以尝试启动它并查看其状态:

g! start 5
g! bundle 5
Location             file:../OSGiDmHelloWorldProvider-1.0.jar
State                32
Version              1.0.0
LastModified         1279124741320
Headers              [Tool=Bnd-0.0.357, Bundle-Activator=com.bw.osgi.provider.ProviderActivator, Export-Package=com.bw.osgi.provider.able, Build-Jdk=1.6.0_20, Bundle-Version=1.0.0, Created-By=Apache Maven Bundle Plugin, Bundle-ManifestVersion=2, Manifest-Version=1.0, Bundle-Vendor=Baptiste Wicht, Bnd-LastModified=1279124686551, Bundle-Name=Unnamed - OSGiDmHelloWorldProvider:OSGiDmHelloWorldProvider:bundle:1.0, Built-By=wichtounet, Bundle-SymbolicName=OSGiDmHelloWorldProvider, Import-Package=com.bw.osgi.provider.able,org.osgi.framework;version="1.5"]
BundleContext        org.apache.felix.framework.BundleContextImpl@2353f67e
BundleId             5
SymbolicName         OSGiDmHelloWorldProvider
RegisteredServices   [HelloWorldService]
ServicesInUse        null

一切都很好。 我们的服务注册良好

现在,我们将尝试在第二个捆绑包中使用此服务。 我们的消费者类别将非常简单:

package com.bw.osgi.consumer;import javax.swing.Timer;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldConsumer implements ActionListener {private final HelloWorldService service;private final Timer timer;public HelloWorldConsumer(HelloWorldService service) {super();this.service = service;timer = new Timer(1000, this);}public void startTimer(){timer.start();}public void stopTimer() {timer.stop();}@Overridepublic void actionPerformed(ActionEvent e) {service.hello();}
}

现在,我们必须创建激活器以获取服务,然后将其提供给消费者。 这将使使用类似这样的东西:

package com.bw.osgi.consumer;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldActivator implements BundleActivator {private HelloWorldConsumer consumer;@Overridepublic void start(BundleContext bundleContext) throws Exception {ServiceReference reference = bundleContext.getServiceReference(HelloWorldService.class.getName());consumer = new HelloWorldConsumer((HelloWorldService) bundleContext.getService(reference));consumer.startTimer();}@Overridepublic void stop(BundleContext bundleContext) throws Exception {consumer.stopTimer();}
}

我们使用类的名称从捆绑软件上下文中获得服务引用。 之后,我们从包上下文获取服务实例。

我们还创建了一个小的pom.xml文件来构建捆绑包:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>OSGiDmHelloWorldConsumer</groupId><artifactId>OSGiDmHelloWorldConsumer</artifactId><version>1.0</version><packaging>bundle</packaging><dependencies><dependency><groupId>org.apache.felix</groupId><artifactId>org.osgi.core</artifactId><version>1.0.0</version></dependency><dependency><groupId>OSGiDmHelloWorldProvider</groupId><artifactId>OSGiDmHelloWorldProvider</artifactId><version>1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>OSGiDmHelloWorldConsumer</Bundle-SymbolicName><Bundle-Activator>com.bw.osgi.consumer.HelloWorldActivator</Bundle-Activator><Bundle-Vendor>Baptiste Wicht</Bundle-Vendor></instructions></configuration></plugin></plugins></build>
</project>

然后,我们使用mvn install创建捆绑包,并将其安装在容器中:

g! start 6
g! Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
g! stop 6

至此,我们已经使用OSGi创建了第一个应用程序。 使用该技术,您可以构建真正独立的模块。

在有关OSGi的下一篇文章中,我们将看到如何使用Spring来简化OSGi的开发,并将精力集中在应用程序而非OSGi上。

这两个捆绑包的来源可在此处获取:

  • OSGiDmHelloWorldProvider来源
  • OSGiDmHelloWorldConsumer

参考: OSGi –简单的Hello World,由JCG合作伙伴 Baptiste Wicht在@Blog(“ Baptiste Wicht”)提供服务 。

相关文章 :
  • OSGi将Maven与Equinox结合使用
  • 真正的模块化Web应用程序:为什么没有开发标准?
  • Java模块化方法–模块,模块,模块

翻译自: https://www.javacodegeeks.com/2011/11/osgi-simple-hello-world-with-services.html

服务osgi

服务osgi_OSGi –具有服务的简单Hello World相关推荐

  1. 微服务面试 - 微服务简单介绍

    微服务 翻译自 Martin Fowler 网站 Microservices 一文.文章篇幅较长,阅读需要一点耐心. 本人水平有限,若有不妥之处,还请各位帮忙指正,谢谢. 过去几年中出现了" ...

  2. SVN服务端的搭建和简单使用

    SVN简单说明 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Su ...

  3. Spring Cloud微服务系统架构的一些简单介绍和使用

    Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...

  4. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。...

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

  5. 代码管理平台介绍、安装svn、客户端使用svn、远程仓库、分支管理、标签管理、git别名、搭建git服务、安装gitlab、简单使用gitlab、备份和恢复

    22.1 代码管理平台介绍 现在的开发工作都是由团队合作来完成开发,通常都是团队中的每个人或者每几个人完成一个模块的开发,最后再将模块拼凑起来,形成一个完整的项目,这就涉及到了协同开发.在各个模块的开 ...

  6. 导出Excel功能-从服务端到浏览器的简单处理

    导出Excel功能 从服务端到浏览器的简单处理, 仅供参考 服务端定义一个导出功能的关键代码 Java 定义一个export的功能函数,以下为关键代码(接口中的一部分处理逻辑): @Override ...

  7. UEFI 系统变量服务和dsc,dec,inf简单理解

    系统变量服务是运行时服务提供的服务,用来操作系统变量. 包括读取系统变量的GetVariable,新建或更改变量的setVariable,遍历系统变量的GetNextVariableName. 要使用 ...

  8. 从Netflix的Hystrix框架理解服务熔断和服务降级

    本文讲的是从Netflix的Hystrix框架理解服务熔断和服务降级,伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前,其实大多数概念以前就有,但很少被提的这么频繁.想起有人总结的一句话, ...

  9. 什么是婚礼一条龙服务及一站式服务

    现代的婚礼市场是一个琳琅满目及鱼龙混杂的市场,面对庆典公司.礼仪服务公司.花坊.花店各种服务的店面,新人如何去选择,可以说是一个很大的难题.面对 不了解的行业,新人往往是茫目的选择,或者是单面的选择, ...

最新文章

  1. 利用硅光子学的移动心脏监护仪
  2. Java基础篇:Java集合
  3. 当世界模型被用于sim2real:机器人通过视觉想象和交互尝试来学习
  4. c# typeof() 和 GetType()的区别
  5. monodroid发布的最新版本
  6. android 网络时区 错误,React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed...
  7. 浅谈BERT/Transformer模型的压缩与优化加速
  8. 程序员职业发展路线规划,快来康康你“修炼”到哪个段位了?
  9. python现在的时间是几点_Python 的日期和时间处理
  10. 学习easyui疑问(一)
  11. 登录授权验证之OAuth2.0
  12. 猪齿鱼 SaaS 版效能平台发布
  13. 移动端 H5 概念术语(一)
  14. linux常用命令课堂总结
  15. 教你如果恢复硬盘直接删除的视频资料
  16. activity_manager_server
  17. SeNet || 注意力机制——源代码+注释
  18. [转] *** 一键安装脚本(四合一)
  19. ironpython clr_[集成IronPython] 添加CLR对象到运行环境
  20. 【已解决】AC86U ML改版固件虚拟内存创建失败,提示USB磁盘读写速度不满足要求

热门文章

  1. jQuery 所有版本在线引用
  2. window7连接其他计算机的打印机,win7系统电脑怎样连接其它电脑上在打印机?
  3. URLConnection-URL连接
  4. java国际化——日期和时间+排序
  5. java线程——什么是线程?
  6. HDU2068(错列排序)
  7. aws terraform_在AWS第1部分中使用Terraform自动缩放组:基本步骤
  8. 如何判断2服务器性能好或坏_无服务器革命:好,坏和丑
  9. jsf教程_JSF范围教程– JSF / CDI会话范围
  10. java oauth2.0_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录