Snaps介绍

 由  YiFei 发布

1.Snaps是什么?

Snaps的前身是springsource下的一个项目,叫slices。后来迁移到了Virgo项目下,叫做Virgo Snaps,简称VS。
使用snaps,我们可以将多个OSGi bundles组建成一个web应用。每一个bundle只负责与URL空间对应的内容。一个snaps web应用一般由一个host与多个snap组成,host是唯一的,snap有多个。每个snap有且只有一个父结点,他们的层次结构如下:

http://assets.osgi.com.cn/article/7289354/Snaps1.png

snaps主要有两个特点,共享性和动态性。共享性,snaps将多个web bundle构成一个整体,这些bundle之间可以共享信息;动态性,这个来源于OSGi本身的特性,每个web bundle都可以动态地增删。

2.如何使用Snaps?

首先,配置好host。这个比较简单,所需要的就是给web应用加一个filter即可。修改web.xml的配置就可以了,如下所示:

 <!-- Snap Host →
<filter>
<filter-name>host-filter</filter-name>                         
<filter-class>org.eclipse.virgo.snaps.core.SnapHostFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>host-filter</filter-name>
 <url-pattern>/*</url-pattern>
 <dispatcher>INCLUDE</dispatcher>
 <dispatcher>FORWARD</dispatcher>
 <dispatcher>REQUEST</dispatcher>
</filter-mapping>

接下来,就是配置每一个snap,每个snap的配置类似。需要做的就是制定snap-host和snap-contextPath。例如,在我们项目中,配置document这个snap,在osgi.bnd配置文件中配置片段如下:

Snap-ContextPath: /document
Snap-Host: org.autumn.web
Module-Type: Web
Bundle-Classpath: .

3.进一步认识Snaps

了解snaps的功能之后,那么snaps是如何做到的呢?在OSGi的环境中,各个bundle的context、spring context都是独立的,借一张图说明一下:

http://assets.osgi.com.cn/article/7289354/Snaps2.png

web bundle的bundle context、spring context、servletContext不是共享的,上图是OSGi框架引入Spring DM后的场景(Spring DM通过与Service Registry交互)。
为了解决这个问题,Snaps将所有的snaps与host共同使用一个servletContext和classLoader。在org.eclipse.virgo.snaps.core.internal.webapp包下的WebAppSnap类中,代码如下:

public final void init() throws ServletException {
    logger.info("Initializing snap '{}'", this.contextPath);
    WebXml webXml = BundleWebXmlLoader.loadWebXml(this.snapBundle);
    SnapServletContext servletContext = new SnapServletContext(this.host.getServletContext(), this.snapBundle, this.contextPath);
    servletContext.setAttribute(WebContainer.ATTRIBUTE_BUNDLE_CONTEXT, this.snapBundle.getBundleContext());

    this.snapClassLoader = this.classLoaderFactory.createWebBundleClassLoader(this.snapBundle);
..........

整个web应用中的Snap与host使用同一个servletContext,信息共享就不成问题了,Spring MVC这样的框架也可以用于整个web应用之上了。 接着往下走,看一看snaps的核心架构,先介绍一下关键的类吧。

类名 简介
Snap 这是一个接口,与OSGi运行环境中snap bundle对应。
WebAppSnap 实现Snap接口的类象,生成的对象是真正代表snap的实体。所有 WebAppSnap的servletContext和classLoader一致,都来自host。每个snap实体存放在一个map里面,可以动态的增删。
WebAppSnapFactory 制造WebAppSnap对象的工厂。
VirtualContainer 在web应用和web容器隔了一层,模拟实际的web容器关键功能。 Host和snap实体与virtual container打交道,并不是直接与virgo交互。
SnapLifecycleListner 监听所有snap的生命周期事件,并调用相应的处理实体。
StandardVirtualContainerRequestDispatcher http请求分派,将request转发到匹配的snap.

这个关键类之间的关系可以画一个图来阐释:

http://assets.osgi.com.cn/article/7289354/Snaps3.png

可以看出,snaps其实就是在web容器里头,用virtual container作为中间人,向内与host与snap这个集合交互,向外与真正的web容器打交道。

暂无相关文章

taourist 2014-02-17 17:29

snaps只支持tomcat,请问下jetty下如何实现类似的应用效果?

顶(0) 踩(0) 回复

罗俊杰 2013-07-17 17:45

回复snoopy7713: http://www.eclipse.org/virgo/documentation/virgo-documentation-3.6.2.RELEASE/docs/snaps-guide/html/index.html

顶(0) 踩(0) 回复

snoopy7713 2013-07-17 13:40

没看明白,有Demo吗?virgo snaps的官方地址是?

顶(1) 踩(0) 回复

Michael 2013-01-31 21:55

回复YiFei: 太帅了!

顶(3) 踩(3) 回复

YiFei 2013-01-29 15:02

这个还比较初级,没有够深入!

顶(0) 踩(1) 回复

andytian 2013-01-29 15:01

good~~

顶(0) 踩(0) 回复
查看评论