【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框架提供的服务,将应用变得 更加模块化。

所以我们接下来要做的就是Spring-DM与OSGI的结合。

可以从 Spring 的网站上下载最新的 Spring-DM 包。目前最新的版本为 1.2.0 RC1,下载地址在:
http://download.csdn.net/detail/u013517797/9463540
下载了这个Spring-DM 包后,我们把压缩包中的dist和lib目录解压到硬盘上的某个目录,比如解压到D盘根目录下的 spring-dm 目录中。那么我们会在D:\Spring-dm\dist目录下看到如下图所示的内容。

在D:\spring-dm\lib中看到如下图所示的内容。


然后我们要在我们的项目中引入需要的Spring插件,我们点击import,然后选择 Import Plugin-ins and Fragments:

然后做一下设置

我们要设置 Plug-in Location,先设置为 D:\spring-dm\dist,导入 sprimg-dm 的包:

点击 Next 后,出现了让我们选择导入的Plugin界面

我们可以导入 core、extender、io 三个 Bundle。

完成后可以在Eclipse的工作区看到引入的三个插件:


我们直接在 Run Configurations 中选择这三个 Bundle,并执行,会发现三个 Bundle 都是INSTALLED状态,如果我们启动Bundle,会报错,原因是我们没有加入这三个Bundle所依赖的Bundle。而这些Bundle,也就在D:\spring-dm\lib目录下。我们用和前面一样的方式来导入lib中所需要的Bundle。
要 导 入 的 Bundle 是 
com.springsource.org.aopalliance
org.springframework.aop
org.springframework.beans
org.springframework.context 
org.springframework.context.support
org.springframework.core


导入完之后我们在Eclipse的工作区看到引入的插件:


我们再次配置一下Run Configurations:


(单纯的,我们自己的加了更多需要的插件)


然后我们将此环境运行起来,然后出现如下画面就是我们的环境配置成功:


然后我们输入ss指令,发现我们的环境中的spring插件全部ACTIVE:


我们的环境配置完成之后,接下来我们开始改造我们的翻译助手项目。
首先改造我们的本地查询服务,我们在localTranslateAsslt的MANIFEST.MF导入我们需要的插件依赖: 
javax.servlet;
javax.servlet.http;
org.osgi.service.http;



然后将本工程下的Activator类删除(我们接下来将不通过Activator来注入Service和获取Service了,我们通过spring的注入来注册和获取相应的服务),并在MANIFEST.MF中删除Bundle-Activator:选项。


然后我们在工程下创建一个名为“OSGI-INF”的文件夹,然后创建一个名为“component.xml”的xml配置文件:

然后在MANIFEST.MF中添加Service-Component: OSGI-INF/component.xml这句话(如果报"Header must be terminated by a line break"的错,在上面那个配置末尾加一个回车就好了)。

这个文件就是配置我们该插件项目注册的Service,其中的内容为:
<?xml version="1.0" encoding="UTF-8"?>
<component name="TranslateService">
<implementation class="com.zyg.osgi.localtranslateasslt.impls.TranslateServiceLocalImpl"/>
	<service>
		<provide interface="com.zyg.osgi.translateasslt.service.TranslateService"/>
	</service>
</component>

可以看到,我们注册了一个名为"TranslateService"的Service,这个Service的实例化类为"com.zyg.osgi.localtranslateasslt.impls.TranslateServiceLocalImpl"。

同理,我们在远程服务插件中做相同的操作,先加入相应的依赖(javax.servlet;javax.servlet.http;org.osgi.service.http;),然后删除Activator类,然后在MANIFEST.MF中删除Bundle-Activator:选项,并创建OSGI-INF的文件夹与component.xml配置文件,然后在MANIFEST.MF中添加Service-Component: OSGI-INF/component.xml这句话。接着在配置文件中写入如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<component name="TranslateService">
<implementation class="com.zyg.osgi.remotetranslateasslt.impls.TranslateServiceRemoteImpl"/>
	<service>
		<provide interface="com.zyg.osgi.translateasslt.service.TranslateService"/>
	</service>
</component>

最后我们修改我们的Web入口插件TranslateClient,先加入相应的依赖(javax.servlet;javax.servlet.http;org.osgi.service.http;),然后删除其Activator类,然后在MANIFEST.MF中删除Bundle-Activator:选项,并创建OSGI-INF的文件夹与component.xml配置文件,然后在MANIFEST.MF中添加Service-Component: OSGI-INF/component.xml这句话。接着在component.xml写入以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<component name="TranslateServlet">
	<implementation class="com.zyg.osgi.translateclient.servlet.TranslateServiceServlet"/>
	<reference name="TranslateService" interface="com.zyg.osgi.translateasslt.service.TranslateService" bind="setTranslateService" unbind="unsetTranslateService" policy="dynamic" cardinality="0..1"/>
	<reference name="HttpService" interface="org.osgi.service.http.HttpService" bind="setHttpService" unbind="unsetHttpService" policy="dynamic"/>
</component>
可以看到我们配置了Servlet和Servlet的实现,然后里面的参数是Servlet依赖的类,分别是TranslateService和HttpService。

然后我们修改一下TranslateServiceServlet,让其能够通过配置文件注入TranslateService和HttpService:
package com.zyg.osgi.translateclient.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.osgi.service.http.HttpService;

import com.zyg.osgi.translateasslt.service.TranslateService;

public class TranslateServiceServlet extends HttpServlet{
	private  static final long serialVersionUID = 1L;

	private HttpService httpService;
	
	private TranslateService translateService;
	
	/**
	 * 注入HttpService
	 * @param httpService
	 */
	public void setHttpService(HttpService httpService){
		try {
			httpService.registerServlet("/servlet/translateServlet", this, null, null);
			httpService.registerResources("/page", "pages", null);
			System.out.println("翻译助手服务已启动成功,请通过/page/translate.html访问!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 注销HttpService
	 * @param httpService
	 */
	public void unsetHttpService(HttpService httpService){
		if(httpService != this.httpService){
			return;
		}
		
		try {
			httpService.unregister("/servlet/translateServlet");
			httpService.unregister("/page");
			System.out.println("翻译助手服务已停用成功,谢谢使用!");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		this.httpService = null;
	}
	
	/**
	 * 注入TranslateService
	 * @param translateService
	 */
	public void setTranslateService(TranslateService translateService){
		this.translateService = translateService;
	}
	
	/**
	 * 注销TranslateService
	 * @param translateService
	 */
	public void unsetTranslateService(TranslateService translateService){
		if(translateService != this.translateService){
			return;
		}
		this.translateService = null;
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//1、取得用户传来的英文单词
		String queryWord=req.getParameter("query_word");
		
		//2、调用方法查找中文含义
		resp.setContentType("text/html;charset=GBK");
		PrintWriter writer=resp.getWriter();
		if(translateService==null){
			writer.println("没有开放翻译服务!");
			writer.close();
			return;
		}
		String result=translateService.translate(queryWord);
		
		//3、返回结果给用户
		writer.println("结果"+result);
		writer.close();
		return;
	}

}

我们配置一下Run Configuration,在之前的基础上,将我们的项目的四个部分全部引入进去(localTranslateAsslt、remoteTranslateAsslt、TranslateAsslt、TranslateClient)

如果出现java.lang.ClassNotFoundException:等错误,应在Target platform中加入等工程中需要的依赖插件。

我们现在运行一下我们的项目:

说明我们的项目运行成功,那么使用ss指令发现我们的插件都是运行正常 的,那么我们先停掉我们的远程服务

测试一下本地服务:





可以看到本地服务查询是正常的,远程服务查询是停掉的。

然后停掉我们的本地服务,启动远程服务:

测试一下远程服务:




可以看到远程服务查询是正常的,本地服务查询是停掉的。

至此,我们的OSGI和Spring-DM整合成功。

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

相关文章
|
6月前
|
自然语言处理 Java 网络架构
解锁跨平台微服务新纪元:Micronaut与Kotlin联袂打造的多语言兼容服务——代码、教程、实战一次打包奉送!
【9月更文挑战第6天】Micronaut是一款轻量级、高性能的Java框架,适用于微服务开发。它支持Java、Groovy和Kotlin等多种语言,提供灵活的多语言开发环境。本文通过创建一个简单的多语言兼容服务,展示如何使用Micronaut及其注解驱动特性实现REST接口,并引入国际化支持。无论是个人项目还是企业应用,Micronaut都能提供高效、一致的开发体验,成为跨平台开发的利器。通过简单的配置和代码编写,即可实现多语言支持,展现其强大的跨平台优势。
99 3
|
8月前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
109 6
|
8月前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
【7月更文挑战第12天】在本文中,作者宏哥介绍了如何在不使用PageFactory的情况下,用Java和Selenium实现Page Object Model (POM)。文章通过一个百度首页登录的实战例子来说明。首先,创建了一个名为`BaiduHomePage1`的页面对象类,其中包含了页面元素的定位和相关操作方法。接着,创建了测试类`TestWithPOM1`,在测试类中初始化WebDriver,设置驱动路径,最大化窗口,并调用页面对象类的方法进行登录操作。这样,测试脚本保持简洁,遵循了POM模式的高可读性和可维护性原则。
102 2
|
8月前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
【7月更文挑战第11天】页面对象模型(POM)通过Page Factory在Java Selenium测试中被应用,简化了代码维护。在POM中,每个网页对应一个Page Class,其中包含页面元素和相关操作。对比之下,非POM实现直接在测试脚本中处理元素定位和交互,代码可读性和可维护性较低。
73 0
|
9月前
|
Java 开发者 Spring
Spring 框架:Java 企业应用开发的“瑞士军刀”,一网打尽所有需求!
【6月更文挑战第25天】Spring框架是Java开发的“瑞士军刀”,以其DI(依赖注入)减少手动管理,提高效率。AOP(面向切面编程)实现非侵入式关注点分离,如日志和事务管理。@Transactional注解简化事务处理,Web支持使Web应用开发更便捷。通过这些工具,Spring解决了复杂需求,增强了代码的可维护性和性能。
49 0
|
10月前
|
Java API Apache
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)
121 0
|
10月前
|
开发框架 数据可视化 前端开发
【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)
【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)
975 0
|
Kubernetes Java 微服务
2023年全新java架构技术框架Quarkus实战神仙文档
Quarkus是一款有别于传统Java架构的新技术框架。它建立在我们熟知的技术栈上,使用了诸多成熟的技术,如JPA、JAX-RS、EclipseVert.x、Eclipse MicroProfile和CDI等,并将这些技术与Kubernetes紧密融合在一起。用户可以借助Kubernetes高效的调度运维能力,最大限度地节约资源。
|
存储 Kubernetes Java
2022年全新java架构技术框架Quarkus实战神仙文档
Quarkus是一款有别于传统Java架构的新技术框架。它建立在我们熟知的技术栈上,使用了诸多成熟的技术,如JPA、JAX-RS、EclipseVert.x、Eclipse MicroProfile和CDI等,并将这些技术与Kubernetes紧密融合在一起。用户可以借助Kubernetes高效的调度运维能力,最大限度地节约资源。
|
自然语言处理 安全 Java
别再写垃圾代码了:试试阿里巴巴 Java 开发插件,打造你的团队专属风格。。。(1)
别再写垃圾代码了:试试阿里巴巴 Java 开发插件,打造你的团队专属风格。。。(1)
406 0
别再写垃圾代码了:试试阿里巴巴 Java 开发插件,打造你的团队专属风格。。。(1)