GlassFish OSGi-JavaEE(二)

深入理解OSGi WEB应用程序规范和GlassFish OSGi/WEB容器

相关文章:GlassFish OSGi-JavaEE (一) GlassFish与企业级OSGi开发

http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/201312/38601.htm

在Part1中,我们提到了企业级OSGi制定了一系列的规范来与JavaEE集成,其中,最具代表性的规范是OSGi WEB应用程序规范,这部分将带领大家深入理解OSGi WEB应用程序规范和GlassFish OSGi/WEB容器。本文将分成以下几个部分:

理解OSGi WEB应用程序规范

构建一个OSGi WEB应用程序

使用GlassFish 4部署OSGi WEB应用程序

深入剖析GlassFish OSGi/WEB容器

思考

理解OSGi WEB应用程序规范

为什么需要OSGi WEB

在信息和网络发达的今天,WEB应用程序已经非常得流行和普遍,一些任务关键型(Mission-Critical)的WEB应用程序每天都在高负荷地运行,很少有中断,因为一次不经意的中断可能造成数据的大规模丢失,以至损失大量的资金而造成严重的后果。这些任务关键型的WEB应用往往出现在证券和股票等相关的金融行业。现在,我们开始考虑一个场景: 几个星期或者几个月甚至几年后,WEB应用的客户或者提供商希望在WEB前端增加一些新的模块或功能,但是,为了增加这些新的模块,我们不能停止WEB应用,而且也不希望再次重构或者改变WEB应用的现有架构和模块。这听起来不可思议,对于这样一个场景,至少应该停止应用程服务的实例吧。但是,客户不会答应。另一方面,在当今大数据的时代,每一秒钟都会有大量的数据进入我们的应用之中。那么,如何解决这样的场景?

一个可行的答案是: 使用OSGi WEB构建我们的应用。

WAB-OSGi WEB的核心

简单地说,OSGi WEB应用程序规范(chapter 128 in the OSGi Enterprise Release 5 Specification[1])定义了OSGi WEB的全部内容。对于OSGi WEB应用程序,典型情况下,它由一个WEB应用程序Bundle(即Web Application Bundle,简称为WAB)所构成。

因此,首先我们需要理解WAB以及和WAR的区别。

WAB简述

在Part1中,我们已经提到Bundle是OSGi中的基本部署和管理实体。所以,WAB首先是一个Bundle,必须提供成为Bundle的OSGi元数据(如, Bundle-SymbolicName, Bundle-Version…),其次,WAB与JavaEE中的WAR一样,依然是服务于WEB应用程序,能够使用Servlet 2.5或更高版本的Servlet规范,因此,WAB必须包含可访问的WEB内容,具体的说,Java Servlet规范定义了一个WEB应用程序的结构并定义了一个基于JAR的文件格式(WAR),WAB必须包含WAR中的静态和动态的内容。

进一步地,要成为一个WAB,需要在MANIFEST.MF文件中通过Import-Package来描述它的依赖,例如: 通过导入javax.servlet来使用Servlet的功能,另外,如果需要向外界提供服务,它也要通过Export-Package来导出服务所在的包。

我们能够通过不同的方式来安装WAB,例如,通过支持企业级OSGi的应用服务器所提供的命令行控制台(如,GlassFish Admin CLI),也可以通过程序的方式调用OSGi底层API来安装WAB(如,BundleContext.installBundle)。无论哪一种方式,WAB安装后,它的生命周期管理就像OSGi运行时的其他Bundle一样。只不过WAB的生命周期被一个Web Extender跟踪,一旦WAB准备服务WEB请求时,Web Extender需要将WAB中可访问的WEB内容部署到WEB运行时。以后当WAB不再服务WEB请求时,Web Extender也需要将这些可访问的WEB内容从WEB运行时卸载掉。

关于WAB的安装,有一点需要额外说明,一个WEB应用程序能够在开发阶段通过工具(例如, Maven插件)被打包成WAB然后进行安装,或者这个WEB应用程序能够在Bundle安装阶段通过Web URL Handler对标准WAR进行转换来透明地创建WAB。GlassFish 4已经实现了后一种机制,我将在后续章节详细阐述。

关于Web Extender和Web URL Handler,它们都是OSGi WEB容器的一部分,我们将在后面章节详细阐述。

从上面的叙述,我们已经看到了安装WAB与安装普通Bundle的明显的不同之处: 除了安装WAB到OSGi运行时,还需要将WAB中可访问的WEB内容部署到WEB运行时。关于这一点,OSGi WEB应用程序规范定义了WAB的生命周期状态图,

图1: WAB的生命周期状态图

摘自: OSGi Enterprise Release 5 Specification

我们将在后续章节中深入阐述图1中的每个阶段。

WAB定义

WAB本身就是一个OSGi Bundle,因此,对于标准OSGi Bundle的定义同样适用于WAB,但是,WAB与标准OSGi Bundle本质的区别在于: WAB需要在MANIFEST.MF中定义Web-ContextPath属性。Web-ContextPath属性定义了这个WEB应用程序访问的上下文路径(Context Path)[2],在WEB服务器上,这个WEB应用程序中所有可访问的资源都要相对于这个上下文路径。例如, 如果在MANIFEST.MF定义了以下Web-ContextPath属性,

Web-ContextPath: /uas

那么访问这个WEB应用程序的URL总是相对于http://host:port/uas,需要注意的是: Web-ContextPath属性的值总是以斜杠’/’开始。

当安装WAB时,除非Web-ContextPath属性出现在MANIFEST.MF中且Web-ContextPath的值是一个有效的值,否则,Web Extender会认为这不是一个WAB,而视为一个普通的Bundle。

时间: 2016-02-04

GlassFish OSGi-JavaEE(二)的相关文章

GlassFish OSGi-JavaEE (一) GlassFish与企业级OSGi开发

欢迎进入GlassFish OSGi-JavaEE专题!自从GlassFish v3开始,一个新的特性被加入到GlassFish中,那 就是GlassFish OSGi-JavaEE.本专题将分为九个部分向大家介绍GlassFish OSGi-Java EE相关的知识: Part1:对GlassFish OSGi-JavaEE做简单的介绍并简要叙述企业级的OSGi开发的现状. Part2: 理解GlassFish OSGi/WEB容器并开发和部署一个WEB 应用程序Bundle到GlassFis

ejb调用ejb(两个ejb都是3.0)为什么调用不成功

问题描述 采用的应用服务器是glassfish,谢了两个简单的ejb(ejb1.ejb2)代码如下:packagecom.ejb1.impl;@StatelesspublicclassTest1implementsTestRemote{publicStringgetStr(){System.out.println("**********************ejb1");return"Hello,EJB1";}}packagecom.ejb2.impl;impor

有关EJB3.1 <module-name>的一些疑问

问题描述 根据EJB3.1规范:<module-name>isthenameofthemoduleinwhichthesessionbeanispackaged.Itdefaultstothebasenameofthebundlewithnofilenameextension,unlessspecifiedintheejb-jar.xmldeploymentdescriptor.我在ejb.jar中做了如下配置:<?xmlversion="1.0"encoding=&

WIN7系统JavaEE(tomcat7 Eclipse)环境配置教程(二)_java

在进行Java Web环境开发之前,首先要做的第一件事就是搭建开发环境,开发环境搭建成功,接下来便是对整个开发环境进行测试,可以通过编写一个简单的JSP程序发布到Tomcat应用服务器上运行. 本文重点介绍Tomcat配置过程,具体内容如下 1.下载Tomcat7.0;下载地址:http://tomcat.apache.org/download-70.cgi:根据自己系统下载相应版本. 2.把下载的压缩包,解压到某硬盘根目录,我解压到D盘根目录. 3.配置Tomcat环境变量: 右击[我的电脑]

敏捷与结构性模块化(二) 研讨OSGi

在上一篇文章中,介绍了结构性模块化与敏捷之间的关系,在这个系列的第二篇文章中,我们将会研讨OSGi,在实现Java的结构性模块化方面,OSGi扮演了核心的角色:OSGi与流行的敏捷方法论之间存在着自然的联系. 1 但我们已经实现了模块化! 绝大多数开发人员都同意程序应该模块化.尽管在面向对象的程序设计出现的早期,逻辑性模块化的要求就被迅速满足了(见http://en.wikipedia.org/wiki/Design_Patterns), 但是软件行业花费了很长的时间才理解结构性模块化的重要性.

基于OSGi实现分布式服务框架历程(二)

在这篇历程中来完成对于JINI的Spike,目标仍然是判断基于JINI实现服务的路由.查找需求的满足度. JINI是由Sun研究院制定的,其目标就是为了实现分布式的服务,所以在很多地方可以看到它和分布式服务框架是有不少重叠之处的,来先看看它对于需求的满足度,最后再来分析做个总结. 1.怎么实现远程的将服务注册到服务中心? 在jini中暂时没有找到远程注册服务到服务中心的方法. jini的服务需要和服务中心部署在同一台机器上,这个倒是可以通过服务管理中心直接将sar格式的服务部署上去,支持服务的动

【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(二)

[前言]别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 --   [下载]个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员.想要word完整版下载的,评论里留言留下你的邮箱! 16.请写出hibernate中主键生成策略? 答:①increment:适用于short,int,long作为主键.不是使用的数据库自动增长机制. * Hibernate中提供的一种增长

JavaEE 要懂的小事:二、图解 Cookie(小甜饼)

这就是因为浏览器Cookie太大,导致请求时,请求头域过大造成发送失败.下面咱们就了解了解Cookie.按着以前的思路图文并茂哈,没图说个XX.   一.概述 首先从HTTP说起,Cookie是Http协议中那部分呢? Cookie是什么? 自问自答:Cookie是请求头域和响应头域的字段.简单地说,就是伴随请求和响应的一组键值对的文本,小文本.所以称之为"Cookie"饼干.Cookie的生命来源于服务器.首先是客户端请求服务端,此时请求为第一次,无Cookie参数.这时候,服务端s

初探Java企业级开源框架OSGi

第一次接触OSGi 是2006年看见的一则网上新闻,该新闻中提到BMW 汽车的通信-娱乐(infotainment)系统采用了OSGi 架构,这套系统主要用来控制汽车上的音箱.灯光.导航和通讯等设备,整个系统由1000多个模块组成,启动时间却只需要3.5秒钟,这对于一个基于Java 的框架来讲,具有两个重大意义:一.说明了Java 执行效率并不差:二.OSGi 框架的性能尤其优秀.因此笔者对OSGi 框架产生了极大的兴趣,后来终于在一个项目中负责研究和开发基于OSGi 框架的应用程序,从此对它便