前阵子调研Pentaho BI,mondrain最为的olap服务器也是调研重点。毕竟Pentaho BI已经做的相当成熟,研究工作在主要从功能和代码结构来分析框架,也涉及到一些源码。下面是一些散乱的点。
Pentaho是宽开源的BI,主要包含以下一些模块:
1) Kettle(Pentaho Data Integration,PDI),它是款以元数据驱动方式实现的ETL工具,支持拖拽操作和图形显示。
2) BI Platform(Pentaho BI Platform and Server),它提供BI构架和解决方案所需的基础,该框架提供的核心服务包括身份验证、日志、审核、网络服务和规则引擎。该平台包括了一个集成的解决方案引擎,提供了报表、多维分析、表盘显示和数据挖掘组件。它模块化的设计和插件的构架允许第三方应用嵌入到本系统中来。
3) Mondrian(Pentaho Analysis Services),它是款在线多维分析的服务,能够实时分析大量的数据。
4)Reporting(Pentaho Reporting),它包括报表设计器和报表引擎,支持多种格式的报表输出。
5)Weka(Pentaho Data Mining),它是全面的机器学习和数据挖掘的工具集,提供了分类、回归、关联规则和聚类等一整套预测分析算法。
还有一些其他的公共组件,如数据访问、图表、仪表盘等。
BI SERVER 是pentaho的核心,它负责将各个模块整合起来。安装后的BI目录结构划分如下:
从图中可以看出,biserver的结构包含3个部分:
data文件夹负责存储数据,这些数据包括它自带的demo数据,更主要的是包含biserver运行所需系统用户等本身权限等的数据。
pentaho-solutions,这个文件夹包含了BI套件的解决方案,前面节介绍到biserver是提供框架和解析引擎的,而所解析的内容就是这个文件夹下的内容。其中主要是steel-wheels文件夹,包含一些默认的BI解决方案,有报表、olap等例子。System主要存储项目的配置信息,有系统配置信息,如数据库连接等,还有各个模块的配置信息和所需的插件,如下图:
Biserver采用Spring初始化Java 对象并管理,利用hibernate进行系统数据库访问,利用spring security管理系统访问控制权限。
还有Tomcat文件夹,BiServer整合了Tomcat,看到里面有3个与pentaho有关的项目。sw-style项目还不清楚具体什么作用,pentaho-style是为pentaho提供样式的,而pentaho是真正的运行解决方案的项目。
Biserver启动过程主要完成系统设置、Java对象初始化和数据源初始化等操作。系统设置主要设置solution-path的路径,并且数据源连接和需要初始化Java类等都在solution-path路径下以配置文件xml形式存在,因此启动过程首先设置solution-path路径。
从tomcat下pentaho项目中web.xml中分析出来项目的启动过程,其中首先
<context-param>
<param-name>solution-path</param-name>
<param-value></param-value>
</context-param>
定义了solution-path的存储路径,自然如果不设置就会有个默认的路径。默认路径需要到源码中才能看到了。在PentahoHttpSessionHelper的getSolutionPath方法中得知,solution-path的路径首先为web.xml中的配置,其次是其中定义的DEFAULT_LOCATIONS,最后在本项目中查找solution-path文件夹。
在PentahoSolutionSpringApplicationContext中定义的getResourceByPath提供了获得solution-path下资源的方法,此方法获得是system文件夹下的,就是在初始化系统时需要用的文件夹。
然后,初始化Java对象,所需要初始化的Bean存储在solution-path的system文件夹下某个xml文件中,即下面配置中的xml文件。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>pentaho-spring-beans.xml</param-value>
</context-param>
WebSpringPentahoObjectFactory的init方法中利用Spring框架的WebApplicationContextUtils初始化Bean,同时保存ApplicationContext类的beanFactory对象用于以后获取Bean对象。
在pentaho-spring-beans.xml中包含的数据源的配置和所有所需初始化类的配置。
剩下的一些启动过程就常见的字符集设置、springSecurity设置和pentaho所用的servlet设置。其中关键
Pentaho的biserver对标准的httpSession进行了封装。利用RequestListener进行设置和封装session。其requestInitialized方法如下:
public void requestInitialized(ServletRequestEvent sre) {
if (!(sre.getServletRequest() instanceof HttpServletRequest)) {
return;
}
HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
IPentahoSession session = PentahoHttpSessionHelper.getPentahoSession(request);
if(logger.isTraceEnabled()) {
logger.trace("binding session "+session+" to request "+sre.getServletRequest());
} PentahoSessionHolder.setSession(PentahoHttpSessionHelper.getPentahoSession(request));
}
该方法主要完成对pentaho的session封装,并且保存在本地线程变量中,主要用到俩个方法。
在PentahoHttpSessionHelper.getPentahoSession(request)中,首先利用request.getSession()获得标准的session,然后session.getAttribute(IPentahoSession.PENTAHO_SESSION_KEY)获得IpentahoSession,自然首次请求即头次标红的地方这个IpentahoSession为null,于是新建PentahoHttpSession,并设置入标准的session中。
PentahoHttpSession依然利用标准的HttpSession进行getAttribute和setAttribute,他主要绑定个sessionParameters,里面包含pentaho常用的变量。
而PentahoSessionHolder.setSession主要将此pentahoSession存入ThreadLocal对象,于是在本次请求任何函数处理过程中,都可以随时获得本session,从而减少了参数传递的复杂性。
由于Tomcat的线程池机制,一个线程在一次请求后可能被不同的session请求,于是需要在request销毁时将此pentahoSession移出线程本地变量。
public void requestDestroyed(ServletRequestEvent sre) {
PentahoSessionHolder.removeSession();
}
该方法就是将pentaho的session移除本地线程变量中。
这就是Pentaho的Sesssion管理机制。