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

(本文档仅供参考)

Smartbi如何在计划任务中调用外部程序,定时执行特定的任务呢,比如每天定时备份Smartbi的知识库。其实很简单,只需要在计划任务模块新建一个“定制”类型的任务,写一段代码调用外部程序即可。下面就以“每天定时备份Smartbi知识库”为例,详细说明操作过程。


1. 写一个批处理文件smartbi-repo-backup.bat,调用MySQL的命令行工具,对Smartbi的知识库进行备份。将该批处理文件保存到服务器上指定目录下,比如放到D:\盘根目录下。该文件内容如下。

@echo off

REM 获取系统时间,生成导出文件名
set h=%time:~0,2% 
set h=%h: =0%
set sqltime=%date:~0,4%%date:~5,2%%date:~8,2%%h%%time:~3,2%%time:~6,2%
set sqlfile=smartbi-repo-%sqltime%.sql
set sqlpath=d:\smartbi-repo-backup
 
REM 从MySQL备份数据文件
%sqlpath:~0,2%
cd %sqlpath%
set mysqlpath=D:\Smartbi\MySQL\bin
"%mysqlpath%\mysqldump" -P 6688 -u admin -padmin smartbi > %sqlfile%
 
echo OK!


2. 在Smartbi“定制管理 -> 计划任务”资源树下,点击“新建任务”,新建一个计划任务。


3. 任务类型选择“定制”,然后在“自定义设置”部分输入如下代码。点击右下角的“保存”按钮,然后“关闭”该页面。

importPackage(Packages.java.io);
importPackage(Packages.java.lang);

var r = Runtime.getRuntime();
var p = r.exec("cmd.exe /c D://smartbi-repo-backup.bat"); // 要执行的外部程序路径及名称
 
var errReader = new BufferedReader(new InputStreamReader(p.getErrorStream(), "GBK"));
var inputReader = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));
var t1 = new Thread(new Runnable({
	run : function() {
		var line = null;
		while ((line = errReader.readLine()) != null) {
			System.out.println(line);
		}
	}
}));
var t2 = new Thread(new Runnable({
	run : function() {
		var line = null;
		while ((line = inputReader.readLine()) != null) {
			System.out.println(line);
		}
	}
}));
t1.start();
t2.start();
p.waitFor(); // 等待外部程序执行完毕再往下执行

System.out.println("Finished!");



4. 接着“新建计划”,设置每天早上5点定时执行上述任务,设置如下图。


5. 至此,全部完成。该计划任务会每天定时备份知识库,服务器上指定目录下备份的脚本文件如下图。

评论

  1. 杨礼显 发表:

    在批处理文件中,经常需要将操作系统的当前路径,切换到 bat 文件所在的目录下。解决方法是,在 bat 文件中添加如下代码。

    rem 改变系统当前路径到bat文件所在目录
    set currentBatFilePath=%~dp0%
    %currentBatFilePath:~0,2%
    cd %currentBatFilePath%