【OSGI】3.实战OSGI-翻译助手项目01

我们通过写一个真实的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", "美国");
	}

	@Override
	public 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", "小狗");
	}

	@Override
	public 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

时间: 2024-08-28 11:46:50

【OSGI】3.实战OSGI-翻译助手项目01的相关文章

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

我们上次开发了包含本地服务和远程服务两个插件的pulg-in项目,并且学习了如何注册和获取Service,如何绑定Http服务,如何绑定Servlet服务. 接下来我们依旧使用osgi技术,将项目改为使用Spring注入技术的项目. 说到这里不得不介绍一下Spring-DM: Spring-DM指的是 Spring Dynamic Modules.Spring-DM 的主要目的是能够方便地将 Spring 框架和OSGi框架结合在一起,使得使用Spring的应用程序可以方便简单地部署在OSGi环

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

上次我们配置了运行Web项目所需要的Run Configuration环境,创建了客户端入口插件TranslateClient模块,下面我们来继续完成客户端模块的程序. 因为是Web项目,我们要让用户通过浏览器去访问我们的应用,所以我们要去写一些Servlet来处理Http请求. 因为我们的工程是plug-in工程,不是传统的Web project,所以不能直接创建一个Servlet(因为涉及到Web.xm的mapping映射和访问路径的设置),我们需要创建一个类,让它去继承HttpServle

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

不负好时光--<Netty in Action>中文版<Netty实战>翻译手记 引子 "书中自有黄金屋,书中自有颜如玉",这句话从小我老爸就给我讲,当然那个时候真的以为书中真的会有黄金做的屋子和很多玉件.后来慢慢长大了,也渐渐懂得了这句话背后的真正含义.当然,他还给我说过"书山有路勤为径,学海无涯苦作舟"和"少壮不努力,老大徒伤悲".怎么说呢,虽然我父亲的文化程度并不是特别高,但是他教会了我踏实和努力,并教会我"

使用osgi api启动osgi时,用java -jar命令运行报异常,用eclipse运行正常

问题描述 使用osgi api启动osgi时,用java -jar命令运行报异常,用eclipse运行正常 我使用osgi的api写了osgi框架的启动程序,然后使用java -jar 命令运行这个jar包报空指针异常,我在eclipse中运行一切正常,请问这是为什么呀

跪求《实战突击 Java Web项目整合开发》的光盘

问题描述 跪求<实战突击 Java Web项目整合开发>的光盘 解决方案 <实战突击:Java Web项目整合开发>简介及源码 解决方案二: fsd hnf a 肚子上的撒 吧广东省不错vfgxcgcbcb 高兴股份感到vcbc部分 解决方案三: fsd hnf a 肚子上的撒 吧广东省不错vfgxcgcbcb 高兴股份感到vcbc部分

Google翻译助手 帮你无障碍网上冲浪

     上网的人一般都会使用搜索引擎来辅助自己浏览网页,查询信息等.而强大的搜索引擎也同样会给大家的上网冲浪带来极大的便利.使用搜索引擎时,语言的作用不言而喻!由于各类原因,很多权威的资讯为国外的网站,而且自己的外语水平又不是很高该怎么办?一款好的翻译辅助软件会是您的得力助手.向您推荐: Google翻译助手.Google的搜索页面 (图1)      作为目前比较主流的两大搜索引擎的google,虽然已经提供了细化语言的分类搜索查询,效果又如何呢?关键字为NBA的Google的搜索页面 (图

CNKI翻译助手-连接数据库失败

IP并发数限制,老师说西工大的CNKI才20个并发指标,HPU自不必说.但是我略表怀疑,这只是翻译助手而已,就像百度翻译和百度数据库的区别,如何验证呢?去校外用该助手,如果能用,那么就不是IP并发限制.  

Asp.net 资源文件翻译助手

     最近项目需要做一个双语的网站,需要将对资源文件进行翻译,在vs里翻译感觉不够方便,参考SimpleResxEditor,自己写了个资源文件编辑助手,自己DIY的才是最好用的,呵呵,软件界面: 使用方法: 实现思路: 1.资源文件对应的实体 namespace ResxEditor { public class ResourceItem { public ResourceItem() { } public ResourceItem(int id, string key, string v

《Swift iOS应用开发实战》——3.2Calculator项目中的控制器

3.2Calculator项目中的控制器 在Calculator项目中,ViewController.swift文件中所定义的ViewController类就是一个视图控制器,与它关联的视图就是Main.storyboard文件中ViewController场景里面的View,如图3-2所示.如果我们选择故事板中ViewController场景中的控制器,然后按Command+Option+3快捷键切换到标识检视窗,就会看到Custom Class部分的Class被设置为ViewControll