1. 概述
1.1 应用场景
用户有时需要使用自定义类型的数据源来进行数据分析和仪表板展示。
1.2 功能简介
FineBI 可以与 FineReport 建立远程连接来使用自定义数据源-程序数据集,从而 BI 引擎读取定义的数据源来进行数据分析和仪表板制作。
注:2019-06-14 之后的 5.1 版本对程序数据集的更新做了优化,从全量数据抽取到内存的方式改为了流式抽取,支持亿级数据量的抽取。
2. 示例
本例以 FineBI 内置的模板执行日志为例进行介绍。
2.1 定义数据源程序
点击下载模板执行日志文件:ExecuteLog.class
点击下载平台管理日志文件:OperateLog.class
1)将 ExecuteLog.class 文件并将其拷贝到%FineBI%/webapps/webroot/WEB-INF/classes/com/fr/log下,此时该程序数据源定义成功,如下图所示:
模板执行日志文件代码如下所示,可以进行编译成 class 文件:
package com.fr.log;
import com.fr.data.AbstractTableData;
import com.fr.decision.log.ExecuteMessage;
import com.fr.general.data.TableDataException;
import com.fr.intelli.record.MetricRegistry;
import com.fr.stable.query.QueryFactory;
import com.fr.third.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author Munin
* @version 5.1.3
* Created by Munin on 2020/4/27
*/
public class ExecuteLog extends AbstractTableData {
private static final long serialVersionUID = -3233073054624031382L;
private String[] columnNames = {
"tname",
"type",
"userrole",
"param",
"ip",
"username",
"consume",
"sql",
"browser",
"memory",
"time",
"reportId"
};
private List<List<Object>> cacheData = new ArrayList<>();
public ExecuteLog() {
}
/**
* 懒加载,解决不必要的取明细性能问题
*/
private List<List<Object>> getExecuteData() {
if (CollectionUtils.isEmpty(cacheData)) {
init();
}
return cacheData;
}
private void init() {
try {
List<ExecuteMessage> messages = MetricRegistry.getMetric().find(ExecuteMessage.class, QueryFactory.create()).getList();
if (messages != null && !messages.isEmpty()) {
for (ExecuteMessage message : messages) {
List<Object> objects = new ArrayList<Object>();
objects.add(message.getTemplate());
objects.add(message.getType());
objects.add(message.getUserrole());
objects.add(message.getParameters());
objects.add(message.getIp());
objects.add(message.getUsername());
objects.add(message.getConsume());
objects.add(message.getSql());
objects.add(message.getBrowser());
objects.add(message.getMemory());
objects.add(message.getTime());
objects.add(message.getReportId());
cacheData.add(objects);
}
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
@Override
public int getColumnCount() throws TableDataException {
return columnNames.length;
}
@Override
public String getColumnName(int i) throws TableDataException {
return columnNames[i];
}
@Override
public int getRowCount() throws TableDataException {
return getExecuteData().size();
}
@Override
public Object getValueAt(int i, int i1) {
List<List<Object>> data = getExecuteData();
if (i < data.size()) {
List<Object> message = data.get(i);
if (i1 < message.size()) {
return message.get(i1);
}
}
return null;
}
2.2 建立远程连接
首先需要将设计器远程连接至 FineBI 服务器。此处详情请参见:远程连接 FineReport 设计器
1)打开设计器,选择服务器>服务器数据集,如下图所示:
2)进入服务器数据集设置界面,选择+>程序,如下图所示:
3)点击选择,选择添加的ExecuteLog.class文件,点击确定保存。如下图所示:
4)在服务器数据集下能看到刚刚添加的程序数据集,如下图所示:
注:此处若想添加多个,可重复上述步骤选择 OperateLog.class 文件添加。
2.3 FineBI 中添加程序数据表
1)登录数据决策系统,选择数据准备,进入业务包选择添加表>数据库表,如下图所示:
2)在服务器数据集下,可以看到刚刚在设计器中添加的程序4,选中表并点击确定添加到业务包中即可使用。如下图所示: