1 概述
需求:某些项目中,要求Smartbi服务器这边提供一个servlet,请求该servlet会返回一段json字符串,来说明smartbi服务器是否能正常登陆、业务库是否异常、各种池是否正常。其作用是可以使得第三方系统能实时地获取Smartbi服务器的状态,一旦发生宕机,可以做出策略和通知,如发邮件通知管理员等。参考附件中的ServerStatus.java文件。
注意:本示例源码仅作为参考性质。
反馈的状态数据(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文件。
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("xxx", "xxx");
userManagerModule.logout();
req.setAttribute("loginStatus", isOk);
}
chain.doFilter(request, 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)
下面只是源码文件,需要自己创建扩展包使用。