我们通过写一个真实的Web项目来深入学习使用OSGI技术。

我们做一个Web版的翻译助手(类似电子英汉词典之类的)

(1)服务接口模块
我们在Eclipse中创建一个pulg-in项目:

我们创建一个接口,并编写方法

package com.zyg.osgi.translateasslt.service;public interface TranslateService {//翻译方法public String translate(String word);
}

我们回想一下现在的翻译软件,当有网络的时候执行的是网络查询,没有网络的时候进行的本地查找,所以我们这个项目要除了这个TranslateAsslt之外,还要衍生出两个插件,分别是“本地查询”模块和“网络查询”模块。

我们到时候要实现随时换本地端,随时换网络端的服务。

(2)本地查询插件
我们这里开始建立本地查询的插件

我们接下来要实现TranslateAsslt的TranslateService接口,重点来了,我们没有将TranslateAsslt项目的任何jar包加入我们的localTranslateAsslt项目,我们如何去调用TranslateAsslt的TranslateService接口呢?

重点就在MANIFEST.MF配置上,我们可以选择对外公布哪些插件,然后引入外部的哪些插件。

为了使用TranslateAsslt的TranslateService接口,我们首先让TranslateService接口“暴露”给其它的插件,也就是在TranslateAsslt的
MANIFEST.MF配置文件中配置需要“暴露”给其他插件的部分:

然后在localTranslateAsslt工程中通过MANIFEST.MF配置文件引入TranslateAsslt“暴露”给外面的部分:

接下来我们就可以引用TranslateService接口了。
我们创建一个TranslateService接口的实现类TranslateServiceLocalImpl:

package com.zyg.osgi.localtranslateasslt.impls;import java.util.concurrent.ConcurrentHashMap;
import com.zyg.osgi.translateasslt.service.TranslateService;public class TranslateServiceLocalImpl implements TranslateService {private static final ConcurrentHashMap<String, String> dictonary=new ConcurrentHashMap<String, String>();static{dictonary.put("China", "中国");dictonary.put("USA", "美国");}@Overridepublic String translate(String word) {System.out.println("LocalTranslateAsslt Service---------->");String result=dictonary.get(word);if(null==result){result="未找到您所查单词意义,请检查单词是否正确!";}return result;}
}

因为我们的程序侧重于解决大规模并发访问的问题,我们用并发包(java.util.concurrent.)中的ConcurrentHashMap<K, V>来储存查询对象。

(3)网络查询插件
接下来我们创建一个网络端的查询插件:

然后我们也引入TranslateAsslt“暴露”的TranslateService接口:

然后创建TranslateService接口的实现类TranslateServiceRemoteImpl:

package com.zyg.osgi.remotetranslateasslt.impls;import java.util.concurrent.ConcurrentHashMap;
import com.zyg.osgi.translateasslt.service.TranslateService;public class TranslateServiceRemoteImpl implements TranslateService {private static final ConcurrentHashMap<String, String> dictonary=new ConcurrentHashMap<String, String>();static{dictonary.put("cat", "小猫");dictonary.put("dog", "小狗");}@Overridepublic String translate(String word) {System.out.println("RemoteTranslateAsslt Service---------->");String result=dictonary.get(word);if(null==result){result="未找到您所查单词意义,请检查单词是否正确!";}return result;}
}

(4)客户端入口插件
然后我们还需要一个客户端的pulg-in项目TranslateClient,提供系统运行前台界面和组织各个模块的调用:

我们要以Web的方式来访问我们的应用。我们要在插件里面写Web,而不是在TomCat的环境下写,但是最终都是要进行Http访问的。

我们osgi中嵌入的是jetty服务器,还有http访问所需要的一切插件都是Web访问所必须的,所以我们要配置Web的访问环境。所以我们新建一个运行配置(Run Configurations--->OSGI Framework--->New),给这个配置起名为“TranslateService”,我们要进行必要插件的安装:

(两幅图展示了运行时需要的所有插件jar,大家根据情况可以自己添加,必要时按检测按钮Validate Bundles查看插件是否引入完整)

要注意:我们的Run Configurations配置的是“运行时的环境”,跟我们开发时需要些什么东西,引入什么jar包两边是没有任何关系的。“运行时的环境”就是你编译之后运行时的class程序需要调用什么,就到运行时环境中去寻找,所以这里编译环境和运行环境是不一样的,就像我们的下载的jdk一样,有时候会带有一个jre,当我们自己不写代码,只运行别人的代码的时候,只装一个jre都足够了,但是如果自己开发的话,就要安装jdk(jre都可以不用装)。这里的概念和上面一样。

大家启动的时候可能会遇到这种问题:

这说明我们osgi的启动端口被占用了,我们要解除占用,有两个方法:
(1)更改osgi的启动端口
在配置选项卡中选择“{x}= Arguments”,然后加入
“-Dorg.osgi.service.http.port=8010”即可(可以自己指定端口号,我这里使用的是8010端口)

(2)找到占用端口的程序,杀死它
运行cmd控制台,输入netstat -ano指令查看端口使用情况:

osgi默认端口是80,我们在控制台中找到使用80端口的程序,找到他的PID为4,接下来我们到“任务管理器”(Ctrl+Alt+Delete键呼出)中找到程序详细信息列表,点击PID让其按照PID排序,找到PID为4的程序,杀死它:

(很遗憾我的80端口被系统占用了,所以我使用了第一种方法解决了端口占用的问题)

解决上述问题,我们就可以开始启动我们的项目了:

看到这个之后,说明我们的运行环境配置正确:

我们接下来要做的就是Web项目的一些内容的编写,包括Servlet的创建,为了让大家看的更明白一些,我将其单独总结到下一篇文章中。

转载请注明出处:http://blog.csdn.net/acmman/article/details/50906996

【OSGI】3.实战OSGI-翻译助手项目01相关推荐

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

    我们上次开发了包含本地服务和远程服务两个插件的pulg-in项目,并且学习了如何注册和获取Service,如何绑定Http服务,如何绑定Servlet服务. 接下来我们依旧使用osgi技术,将项目改为 ...

  2. 【OSGI】4.实战OSGI-翻译助手项目02

    上次我们配置了运行Web项目所需要的Run Configuration环境,创建了客户端入口插件TranslateClient模块,下面我们来继续完成客户端模块的程序. 因为是Web项目,我们要让用户 ...

  3. OpenCV-PyQT项目实战(5)项目案例01:图像模糊

    欢迎关注『OpenCV-PyQT项目实战 @ Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyU ...

  4. 『菜鸟手机助手』-做一个属于自己的AppStore-Android助手项目

    『菜鸟手机助手』-做一个属于自己的AppStore-Android助手项目 官方地址:http://www.cniao5.com/course/lessons/10124 注意:更新未完整,更新至41 ...

  5. OSGi介绍及OSGi的Bundle应用

    http://blog.sina.com.cn/s/blog_50356fbb0100dytp.html 关键字: OSGi Bundle Plugin Eclipse 开放服务网关协议 (Open ...

  6. ServiceMix异常(1):missing requirement [262.0] osgi.wiring.package;osgi.wiring.package=org.apache.camel

    环境 servicemix :6.1.0 jdk:jdk1.8.0_191 项目中使用的camel版本:2.23.1 servicemix中安装的camel版本:2.16.1 起初小编在开发的时候就直 ...

  7. 《Netty IN ACTION》中文版《Netty实战》翻译手记——不负好时光

    不负好时光--<Netty in Action>中文版<Netty实战>翻译手记 引子 "书中自有黄金屋,书中自有颜如玉",这句话从小我老爸就给我讲,当然那 ...

  8. linux 退出服务器_Vue实战091:Vue项目部署到nginx服务器

    项目开发完成之后我们就需要将项目上线运行供用户访问,这时候我们就需要将项目部署到服务器上.对于Vue这种前端Web项目我们一般都部署在linux系统上,Linux常见的Web应用服务器有Apache. ...

  9. 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》

    <实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明    辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...

最新文章

  1. MFC中CStatic控件动态改变
  2. 快成物流科技 x mPaaS | 小程序容器加持下的技术架构“提质增效”
  3. python文件路径操作及pathlib库
  4. 六核cpu安装SQL Server 2005时报错,提示启动服务失败
  5. Windows 10 开启有线无线802.1x脚本
  6. ubuntu 开源镜像_Ubuntu手机可能对开源意味着什么
  7. 一篇搞定导航守卫(vue-router源码学习)
  8. 中国各省份矢量地图-可编辑
  9. awg线规,直径,面积,电流对照
  10. win10系统realtek高清晰音频管理器有什么用
  11. 删除c盘itunes备份_如何查找,备份和删除iTunes备份
  12. ruoyi 项目启动步骤
  13. [iOS]让你的应用支持新iPad的Retina显示屏
  14. 异步协议与同步协议:面向字符的协议BSC协议
  15. python runner功能_Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)...
  16. matlab中不能找到ccs,搭建matlab连接ccs生成28335代码的环境(路径不在C盘)
  17. linux 5.5安装万兆网卡驱动,CentOS下安装网卡驱动
  18. mintUI Popup的使用
  19. excel处理技巧三
  20. 石墨烯核心技术深度分析

热门文章

  1. html语言基范例,简单html网页范例
  2. 云服务器磁盘空间被异常占满,导致服务器无法正常使用。
  3. 90分钟详解网络编程相关的细节处理丨 reactor丨网络io丨epoll丨C/C++丨Linux服务器开发丨后端开发丨Linux后台开发
  4. 机械工程有必要学python吗_Linux运维工程师有必要学习Python吗?北京老男孩教育
  5. python time limit exceeded_Python 的leecode问题
  6. python锁_Python中四种锁的使用示例(代码)
  7. STM32Cube高效开发教程(基础篇)
  8. 3D激光SLAM:Livox激光雷达硬件时间同步
  9. ZooKeeper客户端源码(一)——向服务端建立连接+会话建立+心跳保持长连接
  10. shell常用命令大全及注意事项