页面树结构
转至元数据结尾
转至元数据起始

1 概述

需求:某些项目中,要求Smartbi服务器这边提供一个servlet,请求该servlet会返回一段json字符串,来说明smartbi服务器是否能正常登陆、业务库是否异常、各种池是否正常。其作用是可以使得第三方系统能实时地获取Smartbi服务器的状态,一旦发生宕机,可以做出策略和通知,如发邮件通知管理员等。参考附件中的ServerStatus.java文件。

注意:本示例源码仅作为参考性质。

此版本同样适用于 v7 

可以在浏览器端测试监控结果

输入:http://localhost:8080/smartbi/ServerStatus

反馈的状态数据(JSON格式)
{
    "success": true,
    "returnObject": {
        "loginStatus": "能正常登陆",
        "dbStatus": "数据库正常",
        "DS.SmartbiUnionbase": "数据库正常",
        "DS.SYSTEM知识库": "数据库正常"
    }
}

 2 获取smartbi服务器是否能正常登陆

       一般情况下,在该servlet中,直接调用Smartbi的Sdk中的ClientConnector类的open或openFromDB方法就可以;如果Smartbi接入到cas单点登陆平台的话,用CASClientConnector类的 open 方法。

      但此项目比较特殊,登录界面有验证码,一般的做法无法模拟成功登录。考虑到验证码是在业务代码里面执行,所以可以通过将调用模拟登录的代码写在业务代码之前即可。最后的做法是,添加一个filter,访问该servlet之前会访问filter;在filter中调用UserManagerModule的loginFromDB方法。将登录的结果放在request对象。参考附件中的SmartbiCheckLoginFilter.java文件。

package cn.sun.smartbi;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import smartbi.framework.rmi.RMIModule;
import smartbi.state.StateModule;
import smartbi.usermanager.UserManagerModule;
public class SmartbiCheckLoginFilter implements Filter {
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		//ScheduleTaskModule stm = ScheduleTaskModule.getInstance();
		HttpServletRequest req = (HttpServletRequest) request; 
		if("/ServerStatus".equals(req.getServletPath()) 
				|| "/MobileServerStatus".equals(req.getServletPath())) {
			//模拟登陆部分,下面四行代码即模拟登陆部分。
			//UserManagerModule userManagerModule = UserManagerModule.getInstance(); 
			//boolean isOk = false;
			//isOk = userManagerModule.loginFromDB("admin", "021232f297a57a5a743894a0e4a801fc3");
			//userManagerModule.logout();
			req.setAttribute("loginStatus", true);	//这里因为没有进行模拟登陆,直接传true参数
			//req.setAttribute("loginStatus", isOk);
		}
		chain.doFilter(req, response);
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
	}
}

3 业务库、各种池是否正常

     相当于smartbi服务器能否连接到业务库、各种池。这里的做法是在该servlet中,遍历所有的数据源,然后根据数据源调用Smartbi的连接池类ConnectionPool的getConnection方法即可。参考附件中的ServerStatus.java文件。

	private final String checkDataSource(String dsId){
		DataSource dbDs = FreeQueryDAOFactory.getDataSourceDAO().load(dsId);
		Connection conn = null;
		String dbStatus = "数据库正常";
		try {
			conn = ConnectionPool.getInstance().getConnection(dbDs);
		} catch (Exception e) {
			System.out.println("ServerStatus监测到异常:"+dsId+e.toString());
			logger.debug("ServerStatus监测到异常:"+dsId+e.toString());
			dbStatus = "数据库异常";
		} finally {
			try {
				if (conn != null)
					conn.close();
				if (!dbDs.getUrl().startsWith("JNDI:"))
					ConnectionPool.getInstance().closePool(dbDs);
			} catch (Throwable e) {
				System.out.println("");
			}
		}
		return dbStatus;
	}

3 相关资源(EPPR-7022)

下面只是源码文件,需要自己创建扩展包使用。

CheckLogin.ZIP

web.ext