设想这样一种情况, 你每隔一段时间就会收到一批数据文件, 然后需要把这些文件导入到SAP HANA. 在一般情况下,你至少需要写一个导入数据的脚本程序, 然后再利用定时任务管理器去调度这个定时任务. 如果你用的是SAP HANA, 可能会问, SAP HANA提供的功能这么多样化, 包括文本分析, PAL, WEB 服务器等等, SAP HANA能让它定时执行某些任务吗?

          SAP HANA SPS07版本之前, 我只能遗憾的告诉你, 这个还不行, 不过SAP HANA SPS07之后, 让一切变得简单起来, 并且非常的Cool. 你可以让SAP HANA自动的定时去执行你想让它完成的任务, 只需要SAP HANA就够, 它能自己调度定时任务!

          简单来说, SAP HANA的定时任务调度利用到了XS Engine, 用它来对定时任务进行管理可以调度SQLScript脚本与javascript脚本两种类型的程序. 废话不多说, 下面直接进入示例子.

  环境配置

        首先建议对SAP HANA的配置稍微修改一下, 如下图.

/wp-content/uploads/2014/04/readonly_423432.png

     在默认情况下, indexserver.ini, repository小节中的sqlscript_modedefault. 建议改成’UNSECURE’ , 如下图所示.

default模式下,只能读取数据, 无法作insert操作, 在编写存储过程的时候直接会报错.

/wp-content/uploads/2014/04/studioconfig_423433.png

     另外,对于你要操作的SCHEMA, _SYS_REPO用户分配必需的权限. 否则activate的时候会报错. 比如下面的截图.

/wp-content/uploads/2014/04/activate_423443.png

     所以需要给_SYS_REPO用户分配关于WEIYY这个SCHEMA的所有权限. 设想一下, 当你commitrepository的时候, 然后执行activate激活的时候,是由_SYS_REPO用户进行生成相关对象的,所以_SYS_REPO必须相应的权限.

/wp-content/uploads/2014/04/grant_423444.png

     最后, 还需要开启xsengine中对任务调度的支持, 如下图所示, xsengine.ini, 添加一个scheduler小节, 添加enabled属性, 值为true.  这样,环境我们就准备好了.

QQ截图20140306133924.png

  定时任务

             任务本身的描述有两种方式, 前面说过了, 可以是一个javascript任务, 具体来说是xsjs文件中的某个函数. 另外一种方式是SQLScript, 具体来说就是一个存储过程对任务的调度信息描述由xsjob文件进行描述下面由例子说明, 我们将分别实现一个javascript定时任务跟SQLScript定时任务.

             首先我们在SAP HANA Studio中新建一个XS Project, 并新建一个.xsapp文件(具体参考开发文档). 然后建立一个jsjobtest.xsjs文件, 这是一个xsjs类型文件, 里面包含一个函数myjsjob, 这个函数就是我们的任务要做的事情, 具体来说就是往TESTTBL中插入一条记录, 记录当前时间及提示信息.

File:jsjobtest.xsjs


function myjsjob() {
    var sql = "INSERT INTO WEIYY.TESTTBL VALUES (NOW(), 'inserted from javascript job')";
    var conn = $.db.getConnection();
    var pstmt = conn.prepareStatement(sql);
    pstmt.execute();
    conn.commit();
    conn.close();
}


然后,我们需要一个xsjob文件, 来描述这个任务何时被调度.

File:myjsjobdesc.xsjob

{

    “description”: “my first javascript job”,

    “action”: “weiyy.scheduletest:jsjobtest.xsjs::myjsjob“,

    “schedules”: [

    {

    “description”: “run every 5 seconds”,

    “xscron“: “* * * * * * 0:59/5”

    }

    ]

}

     在description,输入对任务的描述, action中指定任务的文件, 及对应的函数入口, schedules中指定调度时间. 这个跟Linux环境下的crontab语法类似, 这里我们指定每5秒钟执行一次.

             我们再添加一个SQLScript任务. 同样也是往TESTTBL中插入数据, 但提示信息不同.

File:sqljobtest.procedure


CREATE PROCEDURE sqljobtest ( )
     LANGUAGE SQLSCRIPT
     SQL SECURITY INVOKER
     --DEFAULT SCHEMA <schema>
AS
BEGIN
/*****************************
     Write your procedure logic
 *****************************/
insert into WEIYY.TESTTBL(T,INFO) VALUES(NOW(),'insertted from SQLScript job');
END;


这里我们让它每10秒钟运行一次.

File:mysqljobdesc.xsjob

{

    “description”: “my first SQLScript job”,

    “action”: “weiyy.scheduletest::sqljobtest“,

    “schedules”: [

    {

    “description”: “run every 10 seconds”,

    “xscron“: “* * * * * * 0:59/10”

    }

    ]

}

[注意:js任务与SQLScript任务的action格式不同]

启动定时任务

            添加任务之后, 下一步就是启动这些定时任务启动这些定时任务的管理页面基于XS Administration Tool , 并且需要预先分配sap.hana.xs.admin.roles::JobAdministrator这个角色才能管理定时任务. 对于不同的HANA  实例, web地址如下格式所示:http://<WebServerHost>:80<SAPHANAinstance>/sap/hana/xs/admin/


     对于我们的javascript任务设置一下UserLocale参数, 最后勾上”Active”, 任务就算激活了.

/wp-content/uploads/2014/04/myjsjobdesc_423449.png

对于SQLScript任务, 同样做如下配置

/wp-content/uploads/2014/04/mysqljobdesc_423450.png

然后回到我们的SAP HANA  Studio, 查寻一下结果.

/wp-content/uploads/2014/04/data_423451.png

发现任务已经执行了, 两个任务都有在执行, 并且javascript任务的执行次数更多.

”_SYS_XS”.”JOBS”系统表中存储了任务相关信息, ”_SYS_XS”.”JOB_LOG”系统表可以查看任务的日志信息.

/wp-content/uploads/2014/04/jobs_423452.png

/wp-content/uploads/2014/04/log_423453.png

利用XS Engine中的javascript API借口, 还可以实现在运行时动态地添加或者删除定时任务, 有关更多关资料请参考http://help.sap.com/hana/SAP_HANA_Developer_Guide_en.pdf.

[本文的测试案例所使用的SAP HANA版本为SAP HANA SPS7 Revision 70.00]

想获取更多SAP HANA学习资料或有任何疑问,请关注新浪微博@HANAGeek!我们欢迎你的加入!

转载本文章请注明作者和出处http://scn.sap.com/community/chinese/hana/blog/2014/04/02/%E5%9C%A8sap-hana%E4%B8%AD%E6%89%A7%E8%A1%8C%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1,请勿用于任何商业用途。

To report this post you need to login first.

4 Comments

You must be Logged on to comment or reply to a post.

  1. wang haifeng

    根据官方文档和这篇blog的方法试验了一下定时job,发现任务无法执行,报Access to source *.xsjs denied (404),是不是还要设置别的什么用户权限啊

    (0) 
  2. ZHAO QING

    作者真牛!谢谢你的奉献,我这边已经实验成功了,想在项目中使用,但如何调用一个有IN参数的存储过程?百试不通,请高手赐教 QQ52452197

    (0) 

Leave a Reply